화살표 함수로 콜백 this 해결하기
화살표 함수로 콜백 this 해결하기
시작하기에 앞서
최근에 콜백 함수 안에서 this
가 바뀌는 문제를 겪었고,
이 포스팅을 통해 화살표 함수가 왜 필요한지를 정확히 이해하려 한다.
this
키워드는 자바스크립트에서 헷갈리는 개념 중 하나이다.
특히 콜백 함수에서 this
가 바뀌어 의도치 않은 에러가 발생하곤 한다.
ES6의 화살표 함수(Arrow Function)를 사용하면 이러한 문제를 해결할 수 있다.
일반 함수와 화살표 함수의 this 차이
- 일반 함수는 호출 방식에 따라
this
가 달라지는 함수이다. - 화살표 함수는 선언된 위치의
this
를 그대로 유지하는 함수이다.
글로 보면 뭔말인지 모름!! 예시 고고링
1. 일반 함수 (문제 발생)
일반 함수는 콜백으로 전달될 때 this
가 전역 객체를 가리키게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const user = {
name: '민주',
printName() {
console.log(`나는 ${this.name}!`);
},
};
// Case 1: 직접 호출 → 정상 동작
user.printName();
// "나는 민주!"
// Case 2: 콜백으로 전달 → this 바뀜
setTimeout(user.printName, 1000);
// "나는 undefined!"
원인: setTimeout이 함수를 호출할 때 this를 minju가 아닌 전역 객체로 설정하기 때문이다.
2. 화살표 함수 (문제 해결)
화살표 함수는 this
를 정의 시점의 컨텍스트에 고정한다. 따라서 콜백으로 전달해도 this
가 유지된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const user = {
name: '민주',
showName: () => {
console.log(`나는 ${user.name}!`);
},
};
// Case 1: 직접 호출
user.showName();
// "나는 민주!"
// Case 2: 콜백 전달
setTimeout(user.showName, 1000);
// "나는 민주!"
결과: showName은 인스턴스 생성 시 this가 고정된다. 따라서 콜백으로 실행해도 this는 변하지 않는다.
결론
화살표 함수는 예측 불가능한
this
문제를 해결하기 위한 방법이다.특히 setTimeout, map, filter 같은 콜백에서 안전하게 동작한다.
코드가 단순해지고 버그 발생 가능성이 줄어든다.
그동안 화살표 함수는 문법이 짧고 간결해서 그냥 편하게 써왔다.
앞으로는 단순한 문법 편의가 아니라, this 바인딩을 의식하며 사용해야겠다❗️
This post is licensed under CC BY 4.0 by the author.