this
란?실행 컨텍스트
를 가르킨다.this
는 함수를 호출하는 방법에 의해 결정된다.실행 가능한 코드가 실행되기 위해 필요한 환경
eval
코드자바스크립트 엔진에 의해 실행됨
자바스크립트 코드를 실행하는 인터프리터 - JS 엔진
...
function first() {
...
function second() {
...
}
second();
}
first();
위 코드를 실행하면 어떻게 될까?
실행 컨텍스트는 스택구조로 생성, 소멸되는데 실행 중인 컨텍스트에서 이 컨텍스트와 관련없는 코드(예를 들어 다른 함수)가 실행되면 새로운 컨텍스트가 생성된다. - 실행 컨텍스트
second EC * | ||||
first EC * | first EC | first EC * | ||
global EC * | global EC | global EC | global EC | global EC * |
컨트롤
이 진입하면서 global EC가 생성되고 실행 컨텍스트 스택에 쌓인다. (global EC는 브라우저가 닫힐 때까지 유지)컨트롤
을 직전 코드 컨텍스트에게 반환한다.this
는 어떻게 변경될까?
this
는 함수를 호출하는 방법에 의해 결정된다.
함수를 호출하는 방법 | this |
---|---|
일반 함수 호출시 | 전역 객체 (window 객체) |
메서드 호출시 | 메서드를 호출한 객체 |
생성자 함수 호출시 | 생성자로 만들어낸 객체 |
call , apply , bind | 인자로 전달된 객체 |
this
는 전역 객체를 가르킨다. (브라우저에서 전역 객체는 window
객체)function executeFunction() {
function printThis() {
console.log(this);
}
printThis();
}
executeFunction(); // window 객체
this
를 출력하는 함수를 호출하면 this
는 window 객체를 가르킨다.function printThis() {
console.log(this);
}
printThis(); // window 객체
this
가 window 객체를 가르킨다고 보면 된다.const obj = {
printThis() {
console.log(this); // obj 객체
},
};
obj.printThis();
this
를 출력하는 함수를 호출하면 this
는 obj 객체를 가르킨다.const obj = {
printThis() {
console.log(this);
},
};
let printThis = obj.printThis;
printThis(); // window 객체 - 일반 함수 방식
obj.printThis(); // obj 객체 - 메서드 방식
var globalValue = 'globalValue';
function printThis() {
this.objectValue = 'objectValue';
console.log(this.globalValue, this.objectValue);
}
printThis(); // globalValue objectValue [this = window 객체]
var obj = new printThis(); // undefined "objectValue" [this = obj 객체]
new
키워드를 통해 생성자 함수를 실행하면, this
가 생성자를 통해 생성되는 객체를 가르킨다.glovalValue
가 존재하지 않으므로 undefined
가 출력된다.printThis
를 생성자 함수가 아닌 일반 함수로 실행하면 this
는 window 객체를 가르킨다.globalValue
, objectValue
둘다 정상적으로 출력된다.this
를 출력하면?$('#button').addEventListener('click', function () {
console.log(this); // button 객체
});
this
가 특정 객체에 연결되는 것이다.call
, apply
, bind
함수로 this
를 변경할 수 있다.bind
bind()
의 인자로 전달된 객체를 새로 생성되는 함수안에서의 this
가 가르키도록 함.function originalFunction(a, b) {
console.log(this.objValue); // objValue
// bind()를 통해 this가 obj를 가르키게 됨
console.log(a, b); // 1, 2
}
const obj = {
objValue: 'objValue',
};
const boundedFunction = originalFunction.bind(obj);
// bind()를 통해 boundedFunction안의 this가 obj를 가르키게 됨
boundedFunction(1, 2); // a와 b전달
화살표함수는 call
, apply
, bind
함수로 this
를 변경할 수 없다. 왜냐면 정적으로 this
가 가르키는 객체가 결정되기 때문!
this
는 언제나 상위 스코프의 객체를 가르킨다.Lexical this
(문맥적 this
)라고 한다.