← 질문 목록
#80깊이 0
같은 함수를 불렀는데 this가 달라지는 이유는?
일반 함수의 this는 함수 정의가 아니라 호출 형태로 정해지기 때문이다. 메서드 호출과 일반 호출은 수신자가 다르며 화살표 함수는 바깥 this를 캡처한다.
| 호출 | 표현 | this |
|---|---|---|
| 생성 | new f() | 새 객체 |
| 명시 | f.call(x) | 엄격 함수면 x |
| 메서드 | x.f() | x |
| 일반 | f() | 엄격 함수면 undefined |
객체에서 메서드를 떼어 콜백으로 넘기면 수신자 정보가 사라진다. bind로 고정하거나 수신자를 보존하는 래퍼를 써야 한다.
화살표 함수에는 자체 this와 arguments가 없다. call이나 apply로 this를 바꿀 수도 없고 new로 생성할 수도 없다. 동적 수신자가 필요한 메서드에는 일반 함수가 맞다.