자바스크립트에서의 this는 호출한 주체에 대한 정보를 담고 있습니다. this를 상황마다 다르게 지정될 수 있으며, 함수와 객체의 메서드에 대해 구분할 수 있는 기준으로 사용할 수도 있습니다.
자바스크립트에서는 실행 컨텍스트가 생성될 때 즉, 함수가 호출될 때, this가 결정됩니다.
클래스를 통해 생성된 인스턴스의 경우, 생성된 자기자신을 가리킵니다.
a
, window.a
, this.a
를 해도 같은 값을 얻을 수 있습니다. var a = 1;
console.log(a);
console.log(window.a);
console.log(this.a);
//일반 함수 func에는 전역객체가 this에 할당됨.
function func() {
console.log(this);
}
func(); // <ref *1> Object [global] { ... } or Window { ... }
var obj1 = {
outer: function() {
...
var innerFunc = function() {
console.log(this);
}
innerFunc();
}
}
obj.outer();
다음과 같이 innerFunc
는 obj1
안의 outer
필드의 함수 내부에서 정의되었지만 innerFunc() 호출 자체가 어떤 객체가 명시되지 않은 독립적인 형태로 호출되었기 때문에 this가 지정되지 않아서 출력된 this는 전역객체가 됩니다.
호출 주체가 없다고 판단될 때, 자동으로 전역객체를 바라보게 되는데, 이를 막고(바인딩하지 않고) 호출 당시 주변 환경의 this를 그대로 상속 받도록 하는 방법은 다음과 같습니다.
var obj1 = {
outer: function() {
...
var self = this;
var innerFunc = function() {
console.log(self);
}
innerFunc();
}
}
var obj = {
outer: function() {
console.log(this); // obj1: {outer f}
var innerFunction = () => {
console.log(this); // obj1: {outer f}
}
innerFunction();
}
};
obj.outer();
var func = function(a, b, c) {
console.log(this, a, b, c);
}
func(1, 2, 3);
func.call({x: 1), 1, 2, 3);
var func = function(a, b, c, d) {
console.log(this, a, b, c, d);
}
var bindFunc = func.bind({x: 1}, 4, 5);
bindFunc(6, 7) // {x: 1}, 4 5 6 7