객체 리터럴에서 'this' 사용하기
중요도: 5
함수 makeUser
는 객체를 반환합니다.
이 객체의 ref
에 접근하면 어떤 결과가 발생하고, 그 이유는 뭘까요?
function makeUser() {
return {
name: "John",
ref: this
};
};
let user = makeUser();
alert( user.ref.name ); // 결과가 어떻게 될까요?
에러가 발생합니다.
직접 실행해 봅시다.
function makeUser() {
return {
name: "John",
ref: this
};
};
let user = makeUser();
alert( user.ref.name ); // Error: Cannot read property 'name' of undefined
에러가 발생하는 이유는 this
값을 설정할 땐 객체 정의가 사용되지 않기 때문입니다. this
값은 호출 시점에 결정됩니다.
위 코드에서 makeUser()
내 this
는 undefined
가 됩니다. 메서드로써 호출된 게 아니라 함수로써 호출되었기 때문입니다.
this
값은 전체 함수가 됩니다. 코드 블록과 객체 리터럴은 여기에 영향을 주지 않습니다.
따라서 ref: this
는 함수의 현재 this
값을 가져옵니다.
this
의 값이 undefined
가 되게 함수를 다시 작성하면 다음과 같습니다.
function makeUser(){
return this; // 이번엔 객체 리터럴을 사용하지 않았습니다.
}
alert( makeUser().name ); // Error: Cannot read property 'name' of undefined
보시다시피 alert( makeUser().name )
와 위쪽에서 살펴본 alert( user.ref.name )
의 결과가 같은 것을 확인할 수 있습니다.
에러가 발생하지 않게 하려면 코드를 다음과 같이 수정하면 됩니다.
function makeUser() {
return {
name: "John",
ref() {
return this;
}
};
};
let user = makeUser();
alert( user.ref().name ); // John
이렇게 하면 user.ref()
가 메서드가 되고 this
는 .
앞의 객체가 되기 때문에 에러가 발생하지 않습니다.