this
가 가리키는 대상이 계속해서 바뀌는 것 때문에 큰 혼란을 겪습니다.
어떤 때는 객체를, 어떤 때는 전역 객체를, 또 어떤 때는 undefined
를 가리키기도 합니다.this
는 함수가 선언된 위치가 아니라, 함수가 this
가 결정되는 4가지 명확한 규칙과, 이 모든 규칙을 무시하는 특별한 경우까지 함께 탐구해 보겠습니다.this
바인딩의 4가지 규칙 🔗this
는 아래 4가지 규칙 중 하나를 따르게 됩니다.'use strict'
)가 아닐 때: this
는 전역 객체를 가리킵니다.
(브라우저에서는 window
, Node.js에서는 global
)this
는 undefined
가 됩니다.
전역 객체를 오염시키는 것을 막기 위한 안전장치입니다.function sayHello() {
console.log(this);
}
sayHello(); // 브라우저 비엄격 모드에서는 window 객체 출력
객체.메서드()
형태로 호출하면, this
는 바로 그 const person = {
name: '홍길동',
greet: function() {
console.log('안녕하세요, 저는 ' + this.name + '입니다.');
}
};
person.greet(); // '안녕하세요, 저는 홍길동입니다.' 출력 (this는 person 객체)
this
가 무엇을 가리킬지 call()
, apply()
, bind()
라는 세 가지 메서드를 사용합니다.함수.call(this로_지정할_객체, 인자1, 인자2...)
함수.apply(this로_지정할_객체, [인자1, 인자2...])
함수.bind(this로_지정할_객체)
: this
가 고정된 새로운 함수를 반환합니다.function introduce(city) {
console.log(`저는 ${this.name}이고, ${city}에 삽니다.`);
}
const user = { name: '이순신' };
// introduce 함수의 this를 user 객체로 강제하고, '서울'을 인자로 전달하여 호출
introduce.call(user, '서울'); // '저는 이순신이고, 서울에 삽니다.' 출력
new
바인딩 (new
Binding) 🔗new
키워드를 사용하여 new
키워드로 함수를 호출하면, 다음 일들이 순서대로 일어납니다.
this
는 바로 이 return
문이 없으면, this
가 가리키는 새 객체가 자동으로 반환됩니다.function Person(name) {
this.name = name;
// return this; 가 암묵적으로 존재
}
const person1 = new Person('강감찬');
console.log(person1.name); // '강감찬' 출력 (this는 person1 객체)
이미지 제안: 4가지 바인딩 규칙의 우선순위를 보여주는 피라미드. 최상단에new
, 그 아래bind/call/apply
,암시적
, 최하단에전역(기본)
을 배치하여 시각적으로 우선순위를 표현.
this
를 가지지 않습니다.this
를 그대로 물려받아 사용setTimeout
이나 map
같은 콜백 함수 내부에서 this
가 바뀌는 고질적인 문제를 매우 우아하게 해결할 수 있습니다.const user = {
name: '유관순',
getFriends: function() {
const friends = ['김구', '안중근'];
// 화살표 함수는 바깥 함수인 getFriends의 this(user 객체)를 그대로 사용합니다.
friends.forEach(friend => {
console.log(`${this.name}의 친구: ${friend}`);
});
}
};
user.getFriends(); // '유관순의 친구: 김구', '유관순의 친구: 안중근' 정상 출력
this
의 동작 원리는 자바스크립트의 실행 컨텍스트 이해도를 직접적으로 보여주므로, 반드시 출제되는 질문입니다.this
는 어떻게 결정되나요? 🔗자바스크립트의this
는 기본적으로함수가 호출되는 방식에 따라 동적으로 결정됩니다. 단독으로 호출되면 전역 객체나undefined
를, 객체의 메서드로 호출되면 그 객체를,new
키워드로 호출되면 새로 생성된 객체를, 그리고call
이나apply
를 사용하면 명시적으로 지정된 객체를 가리키게 됩니다.
this
바인딩 차이점을 설명해주세요. 🔗가장 큰 차이는this
를 가지는지 여부입니다.일반 함수는 호출 방식에 따라this
가 동적으로 결정되는 자신만의this
를 가집니다. 반면,화살표 함수는 자신만의this
를 가지지 않고, 대신 자신을 감싸고 있는상위 스코프의합니다. 이러한 렉시컬this
를 그대로 물려받아 사용this
특성 때문에, 콜백 함수 등에서this
가 달라지는 문제를 쉽게 해결할 수 있습니다.
this
바인딩 원리에 대해 깊이 있게 알아보았습니다.this
는 new
**의 4가지 규칙이 있으며, 우선순위가 존재합니다.this
없이 상위 스코프의 this
를 사용합니다.