This
전역공간에서
- window/global
- 브라우저에서는 window, Nodejs에선 global이 나온다.
함수 내부에서
- window/global
- 함수 내부에서 this는 기본적으로 window를 가리킨다. Default가 window라는 의미이며 바뀔수있다.
메소드 호출시
var a = 10;
var obj = {
a: 20,
b: function(){
console.log(this.a); // 메소드이기때문에 20
function c(){
console.log(this.a); // 함수이기때문에 10
}
c();
}
}
obj.b();
// 스코프체인을 이용해 우회하는 방법
var a = 10;
var obj = {
a: 20,
b: function(){
var self = this; // obj가 담긴다.
console.log(this.a); // obj.a = 20
function c(){
console.log(self.a); // obj.a = 20
}
c();
}
}
obj.b():
- callback에서
- 기본적으로는 함수의 this와 같다.
- 제어권을 가진 함수가 callback의 this를 명시한 경우 그에 따른다.
- 개발자가 this를 바인딩한 채로 callback을 넘기면 그에 따른다.
- call, apply, bind 등의 방식을 이용해서 다른 대상을 this로 바인딩할 수 있다.
- call, apply. bind 메소드에 대하여
function a(x, y, z){
console.log(this, x, y, z);
}
var b = {
c: 'eee'
};
a.call(b, 1, 2, 3); // func.call(thisArg[, arg1[, ard2[, ...]]])
a.apply(b, [1, 2, 3]); // func.apply(thisArg, [argsArray])
var c = a.bind(b); // func.bind[, arg1[, arg2[, ...]]])
c(1, 2, 3);
var d = a.bind(b, 1, 2);
d(3);
/*
결과는 4개 모두 같다
Object {c: "eee"} 1 2 3
*/