🚧 문서 업데이트 중입니다
TODO:
- 콜백 함수의 this
- 생성자 함수의 this
- 화살표 함수의 this
Q1. 다음 코드의 출력 결과는?
const judoTeam = {
nationality: 'South Korea',
slogan: 'gentle way',
members: {
An: {
nickname: 'cold-blooded',
introduce: function () {
console.log(`I am ${this.nickname} in ${this.nationality}!`);
},
},
},
};
judoTeam.members.An.introduce();
A1. 답변:
I am cold-blooded in undefined!
E1. 해설:
단계별 분석:
function
키워드로 선언되었으므로 일반 함수이다. this
바인딩은 함수 호출 방식에 의해 결정된다.judoTeam.members.An.introduce()
와 같이 judoTeam.members.An
객체의 메서드로 호출 되었다.An
)에 this
가 바인딩된다.this
가 바인딩하는 객체:
{ // 전체 블록
nickname: 'cold-blooded',
introduce: function () {
console.log(`I am ${this.nickname} in ${this.nationality}!`);
}
}
즉 이 객체(this
)에는 프로퍼티(property)에 nickname
은 cold-blooded
로 존재하지만 nationality
는 존재하지 않으므로 결과적으로 I am cold-blooded in undefined!
가 출력된다.
Q2. 아래 코드에서 nationality를 'South Korea'로 출력하려면 어떻게 하면 되는가?
const judoTeam = {
nationality: 'South Korea',
slogan: 'gentle way',
members: {
An: {
nickname: 'cold-blooded',
introduce: function () {
console.log(`I am ${this.nickname} in ${this.nationality}!`);
},
},
},
};
judoTeam.members.An.introduce();
// expected: I am cold-blooded in South Korea!
// actual: I am cold-blooded in undefined!
A2. 답변:
const judoTeam = {
nationality: 'South Korea',
slogan: 'gentle way',
members: {
An: {
nickname: 'cold-blooded',
introduce: function () {
console.log(`I am ${this.nickname} in ${judoTeam.nationality}!`);
},
},
},
};
judoTeam.members.An.introduce();
// I am cold-blooded in South Korea!
E2. 해설:
단계별 분석:
nationality
프로퍼티에 직접 접근하고 싶다nationality
프로퍼티를 직접 접근하려면 변수 judoTeam
으로 접근하면 된다judoTeam.nationality
로 접근한다기술적으로 가능한 이유:
introduce
메서드를 실행하면 해당 익명 함수function ()
를 실행하는 컨텍스트에서 Enviroment Record(이하 ER)를 수집한다. ER에는 함수 실행에 필요한 모든 식별자 정보를 담긴다.judoTeam
이라는 변수가 존재하지 않는다.introduce
메서드의 outerER, 즉 상위 스코프는 전역 스코프가 된다. 전역 스코프에는 const
로 선언된 judoTeam
변수가 존재한다. judoTeam
의 nationality
프로퍼티에 접근할 수 있다.TIL을 작성하면서 느낀 점을 작성합니다.