화살표함수의 this는 언제나 상위 스코프의 this를 가리킨다. → Lexical this라고 한다.
→ 화살표 함수 바깥의 this 값이 화살표 함수의 this 값이 된다.
화살표 함수는 bind로 this를 설정하는 것의 syntactic sugar이다.
functionPrefixer(prefix){this.prefix = prefix;}Prefixer.prototype.prefixArray=function (arr) {// this는 상위 스코프인 prefixArray 메소드 내의 this를 가리킨다.returnarr.map(x =>`${this.prefix}${x}`);};constpre=newPrefixer('Hi');console.log(pre.prefixArray(['Lee','Kim'])); //[ 'Hi Lee', 'Hi Kim' ]
✔️화살표 함수를 사용하면 안되는 경우
1. 메서드
constperson= { name:'yejin',sayHi: () =>console.log(`hi ${this.name}`),}person.sayHi(); // hi undefined
sayHi 메서드 내부의 this는 상위 스코프의 this이므로 전역객체 window를 가리킨다.
따라서 화살표 함수로 메서드를 정의하는 것은 바람직하지 않다.
(이제서야 객체 안에서 화살표 함수를 사용하면 this로 같은 객체 내부의 어떠한 것도 가져오지 못하는 이유를 알았다.)
이 경우 ES6의 축약 메서드 표현을 사용하는 것이 좋다. 이 표현을 사용하면 funtion 키워드를 생략하면서, this는 동적으로 결정된다.
constperson= { name:'Lee',sayHi() { // === sayHi: function() {console.log(`Hi ${this.name}`); }};person.sayHi(); // Hi Lee
sayHi 내부의 this는 person객체이다.
{ name:'Lee', sayHi: [Function: sayHi] }
2. prototype
화살표 함수로 정의된 메서드를 prototype에 할당하는 경우에도 같은 문제가 발생한다.
constperson= { name:'Lee',};Object.prototype.sayHi= () =>console.log(`Hi ${this.name}`);person.sayHi(); // Hi undefined
이 때에도 sayHi 메서드 내부가 가리키는 this는 상위 스코프인 전역객체 window이다.
3. 생성자 함수
화살표 함수는 prototype 프로퍼티를 갖고 있지 않다. 따라서 생성자 함수로 사용할 수 없다.
constFoo= () => {};// 화살표 함수는 prototype 프로퍼티가 없다console.log(Foo.hasOwnProperty('prototype')); // falseconstfoo=newFoo(); // TypeError: Foo is not a constructor
4. addEventListener 함수의 콜백 함수
addEventListener 함수의 콜백 함수를 화살표 함수로 정의하면 this가 상위 컨텍스트인 전역객체 this를 가리킨다.