Answer
1. 코드의 간결성
2. 콜백함수 this에 값을 참조시킬때 (this 값에 lexical scope를 참조시킬 때)
3. map 사용할 때 this를 넘격주어 코드를 더 쉽게 작성할 수 있음.
들어가기전
자바스크립트에서
일반 함수는 함수를 선언할 때 this에 바인딩할 객체가 동적으로 결정된다.
즉, 함수를 호출할 때 함수가 어떻게 호출되었는지에 따라 this에 바인딩할 객체가 결정된다.
this에 대해선 아래 링크 참고
반면, 화살표 함수에서는 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정된다.
일반 함수와 달리 언제나 상위 스코프의 this를 가리킨다. 이를 Lexical this라고 한다.
this와 Arrow function
this를 바인딩할 때 왜 화살표함수를 쓰는지 한가지 문제 상황을 살펴보겠다.
아래 콜백함수는 undefined를 출력하고 있다.
콜백함수(setTimeout) 내부의 this는 전역 객체 window를 가리킨다.
myVar 프로퍼티는 window가 아니라 obj의 프로퍼티이기 때문에 오류가 발생한 것이다.
let obj = {
myVar: 'foo',
myFunc: function() {
console.log(this.myVar)
setTimeout(function() {
console.log(this.myVar)
}, 1000)
}
}
obj.myFunc() // foo ... then... undefined
이것을 해결하기 위한 3가지 방법을 소개하겠다.
1. this를 변수에 할당하는 것이다.
let obj = {
myVar: 'foo',
myFunc: function() {
let self = this
console.log(this.myVar)
setTimeout(function() {
console.log(self.myVar)
}, 1000)
}
}
obj.myFunc() // foo ... then... foo
2. 두번 째 방법은 bind,call,apply를 활용하는 것이다.
let obj = {
myVar: 'foo',
myFunc: function() {
console.log(this.myVar)
setTimeout(function() {
console.log(this.myVar)
}.bind(this), 1000)
}
}
obj.myFunc() // foo ... then... foo
3. 세번 째 방법은 아래 arrow function을 사용하는 것이다. (가장 명확한 솔루션)
let obj = {
myVar: 'foo',
myFunc: function() {
console.log(this.myVar)
setTimeout(() => {
console.log(this.myVar)
}, 1000)
}
}
obj.myFunc() // foo ... then... foo
Ref
'프론트엔드 > Javascript' 카테고리의 다른 글
잊을만하면 찾아왔던 오디오 재생버그 (0) | 2023.08.21 |
---|---|
사파리 비동기 함수에서 window.open 우회하기 (0) | 2023.07.02 |
JavaScript- require vs import (CommonJs와 ES6) 차이점 (0) | 2020.10.30 |
실행 컨텍스트 정리 (0) | 2020.10.23 |
이벤트 버블링, 캡쳐링, 위임 (0) | 2020.10.21 |