전역 범위
this는 아무런 코드블럭도 없을 때는, window객체를 가리킨다.
1
|
console.log(this); // Window {}
|
따라서 다음은 모두 같은 값을 출력한다.
1
2
3
4
|
this.a = 1;
console.log(this.a); // 1
console.log(window.a); // 1
console.log(a); // 1
|
함수 범위
다음과 같이 함수 안에 this를 사용했을 땐, window 객체를 가리킨다.
1
2
3
4
|
function myFunc() {
console.log(this); // Window {}
}
myFunc();
|
반면, 다음의 this 키워드는 myFunc 함수가 정의된 obj를 가리킨다.
1
2
3
4
5
6
|
var obj = {
myFunc: function() {
console.log(this); // Object {}
}
};
obj.myFunc();
|
주의할 점은, 다음과 같이 함수를 호출할 때는, window 객체를 가리킨다.
1
2
3
4
5
6
7
8
|
var obj = {
myFunc: function() {
console.log(this); // Window {} ⚠️위의 Object {}와 다른 결과.
}
};
var func = obj.myFunc; // 객체의 함수를 새로운 변수에 할당했다.
func();
|
위와같이 this 키워드는 같은 함수여도 this가 사용되는 문맥에 따라 값이 달라질 수 있는 것이다.
함수 안의 함수
다음과 같이 함수안의 함수에 this키워드를 쓰면, window 객체를 가리킨다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var obj = {
myFunc: function() {
console.log(this); // Object {}
function otherFunc() {
this.foo = 1;
console.log(this); // Window {}
}
otherFunc();
console.log(this.foo); // undefined
console.log(window.foo); // 1
}
}
obj.myFunc();
|
strict 모드일 때, 함수안의 함수에서 this는 정의되어 있지 않다(undefined).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var obj = {
myFunc: function() {
"use strict";
console.log(this); // Object {}
function otherFunc() {
this.foo = 1; // TypeError: 'foo' of undefined
console.log(this);
}
otherFunc();
}
}
obj.myFunc();
|
따라서 함수 안의 함수에서, this 키워드를 사용하여 루트 오브젝트를 참조하고 싶다면, this 키워드가 존재하는 함수 블럭 안에서 that이나 self로 변수를 만들어 this값을 할당하는 방식을 많이 쓴다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var obj = {
myFunc: function() {
"use strict";
console.log(this); // Object {}
var that = this;
function otherFunc() {
console.log(that); // Object {}
}
otherFunc();
}
}
obj.myFunc();
|
정리
- this가 전역 문맥에서 사용되었다면, Window객체를 가리킨다.
- this가 함수 안에서는 Window 객체를 가리킨다.
- this가 객체 안의 함수에서는 해당 객체를 가리킨다.
- this가 함수 안의 함수에서는 Window객체를 가리킨다.
- this가 strict 모드 일 때, 함수 안의 함수에서는 undefined다.
- this가 사용되는 문맥에 따라 결과값이 달라질 수 있기 때문에, 이를 안전하게 사용하기 위한 기법이 존재한다.
this를 안전하게 사용하는 방법은 함수를 정의하고 호출할 때, call, apply, bind 등의 메서드를 사용하는 것인데 이에 대해서는 다음 포스트에 적겠다.