하루에 한 문제
Arrow Function에서 this바인딩 본문
일반 함수는 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정되는 것이 아니고, 어떻게 호출 되었는지에 따라 this 에 바인딩할 객체가 동적으로 결정되었다.
하지만 ES6의 Arrow Function은 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정된다.
동적으로 결정되는 일반 함수와 다르게 화살표 함수의 this는 언제나 상위 스코프의 this를 가리킨다.
이를 Lexical this라고 한다.
var name = 'june';
var juneyoung = {
name: 'young',
getName: function () {
console.log(this.name);
},
};
juneyoung.getName();
위의 코드를 실행하면 console창에는 어떤이름이 찍히게 될까?
- 정답은 'young'이다.
- 객체의 메서드에서의 this는 자신을 호출한 객체로 바인딩되기 때문이다.
그렇다면 아래의 코드에서 console창에 나오는 이름은 뭘까?
var name = 'june';
var juneyoung = {
name: 'young',
getName: () => console.log(this.name),
};
juneyoung.getName();
저 위의 코드와 같이 young이 출력될까?
답은 아니다. 이 포스팅의 맨 위에서 말했듯이 Arrow Function은 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정된다. 언제나 ArrowFunction의 this는 상위 스코프의 this(여기서는 juneyoung 객체의 상위 스코프인 window)를 가리킨다!
즉 'june'이 출력된다!
마지막으로 이 코드에서는 어떤 name이 출력될까?
var name = 'june';
var juneyoung = {
name: 'young',
getName: function () {
var name = 'hi';
(() => {
console.log(this.name);
})();
},
};
juneyoung.getName();
바로 getName()메서드의 상위 스코프인 juneyoung객체의 this에 바인됭되서 'young'이라는 이름을 출력한다!
참고
'Dev > JavaScript' 카테고리의 다른 글
자바스크립트 런타임 : 콜스택과 메모리 힙 (0) | 2021.04.20 |
---|---|
V8 작동원리 (0) | 2021.04.20 |
Promise (0) | 2021.04.19 |
async VS defer (0) | 2021.04.17 |
NPM 이란? (1) | 2021.04.16 |
Comments