대부분의 객체지향 프로그래밍 언어(자바, C#, C++ 등)는 인스턴스가 만들어지는 시점에 정적으로 this가 결정된다. 그러나 자바스크립트에서는 누가 호출하느냐(caller)에 따라 this가 달라진다.
즉, 함수의 실행 시점에 결정되는 값으로 이전에 함수가 어떻게 선언되거나 할당되었는지는 this 값에 영향을 미치지 않는다.
함수가 실행되는 방식은 크게 아래의 네 가지로 나뉜다.
undefined
이다. 함수 내부에 해당 변수의 정보가 없기 때문이다.function Person(name) {
this.name = name;
this.printName = function () {
console.log(this.name);
};
}
const p1 = new Person('김땡땡');
p1.printName();
1) Call
아래는 MDN Function.prototype.call() 문서에 나온 예시를 조금 변형한 것이다.
// name, price 두 가지 정보를 받는 생성자 함수
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
// Product를 호출하며 this를 new Food()를 통해 생성되는 인스턴스로 지정 =>
// Product 함수 내부 코드가 실행되며 new Food()로 만들어지는 인스턴스에 name, price 속성값이 생성된다.
Product.call(this, name, price);
this.category = 'food';
}
const result = new Food('cheese', 5);
console.log(result);
// Expected output: {name: 'cheese', price: 5, category: 'food'}
2) Apply
call()
과 거의 동일하나 두 개의 인자만 받는다. 첫 번째 인자는 this 값, 두 번째 인자는 배열이다.3) Bind
call()
, Apply()
와 달리 bind()
메소드를 호출한 함수를 실행하지 않고 새로운 함수를 반환한다. 즉, 새로운 함수를 반환하는 bind의 실행만 이루어진다.화살표 함수는 렉시컬 환경에서의 this를 기억한다.
다시 말하면, 화살표 함수 밖에서 제일 근접한 스코프의 this를 가리킨다.