this
- JavaScript에서 함수의 this 키워드는 다른 언어와 조금 다르게 동작한다.
- 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있다.
- 대부분의 경우 this의 값은 함수를 호출한 방법에 의해 결정된다.
- 실행중에는 할당으로 설정할 수 없고 함수를 호출할 때 마다 다를 수 있다.
- ES5는 함수를 어떻게 호출했는지 상관하지 않고 this 값을 설정할 수 있는 bind 메서드를 도입했고, ES2015는 스스로의 this 바인딩을 제공하지 않는 화살표 함수를 추가했다.
const test = {
prop: 42,
func: function() {
return this.prop;
},
};
console.log(test.func());
함수 문맥 단순 호출 예시
var obj = {a: 'Custom'};
var a = 'Global';
function whatsThis() {
return this.a;
}
whatsThis();
whatsThis.call(obj);
whatsThis.apply(obj);
function add(c, d) {
return this.a + this.b + c + d;
}
var o = {a: 1, b: 3};
add.call(o, 5, 7);
add.apply(o, [10, 20]);
bind 메서드
f.bind(someObject)
를 호출하면 f
와 같은 본문(코드)과 범위를 가졌지만 this
는 원본 함수를 가진 새로운 함수를 생성한다다.
- 새 함수의 this는 호출 방식과 상관없이 영구적으로
bind()
의 첫 번째 매개변수로 고정된다.
function f() {
return this.a;
}
var g = f.bind({a: 'azerty'});
console.log(g());
var h = g.bind({a: 'yoo'});
console.log(h());
var o = {a: 37, f: f, g: g, h: h};
console.log(o.a, o.f(), o.g(), o.h());
화살표 함수
- 화살표 함수에서 this는 자신을 감싼 정적 범위이다.
- 전역 코드에서는 전역 객체를 가리킨다.
var globalObject = this;
var foo = (() => this);
console.log(foo() === globalObject);