일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- TS
- useAppDispatch
- 무한 스크롤
- React
- async/await
- app router
- CI/CD
- Jest
- recoil
- CORS
- tailwind
- ESlint
- autosize
- 결정 알고리즘
- 인터섹션
- SSR
- 타입 좁히기
- dfs
- 리터럴 타입
- Cypress
- RTK Query
- 공변성
- 이분 검색
- 반공변성
- Promise
- 호이스팅
- 태그된 유니온
- webpack
- 투포인터
- map
Archives
- Today
- Total
짧은코딩
this를 분석할 수 없는 케이스 본문
반응형
zerocho.com 사이트에 들어가서 공지사항을 클릭했을 때
- 2번째 인자의 function이 아니라 addEventListener이 호출 됨
- 2번째 인자 function은 함수의 선언이지 호출된 적이 없다
- 그러면 function은 귀신이 와서 호출해주냐?
- 그렇다고 봐도 됨. 왜냐면 내가 모르는 코드가 호출해주기 때문
- 이런 경우의 this는 외워야한다.
- 왜냐하면 저 함수는 호출하는 부분을 우리가 볼 수 없기에 경험적으로 외워야 한다.
- 결국 저걸 만든 사람만이 알 수 있다.
addEventListener를 구현해보면(추론)
실제 addEventListener는 아마 C++로 구현되어 있을 것이다.
const header = {
addEventListener: function(eventName, callback) {
callback(); // 1.this가 window -> 땡
callback.call(header); // 2.this가 header, 정답
callback.call(this); // 3.정답
}
};
header.addEventListener('click', function () {
console.log(this);
});
- 1번은 그냥 호출했기에 this = window
- 2번은 call을 사용했기에 this = header
- 3번은 this가 호출할 때 정해지며, header.addEventener의 앞에 header가 있기에 this = header
문제
zerocho.com에서 공지사항을 클릭한 상황
const header = document.querySelector('.MainPage__SectionTitle-sc-fp90zm-14');
header.addEventListener('click', () => {
console.log(this);
});
이 상태에서 클릭하면 결과는?
더보기
-이유
- 저 화살표 함수의 부모는 addEventListener이 아님
- () => {console.log(this)} 이 부분은 선언이다!!!
- 따라서 부모는 anonymous여서 this가 window가 된다.
-응용
- 만약 화살표 함수가 아닌 함수인데, 조작하고 싶으면
- call, apply를 사용하자
- a.apply(window) === a.bind(window)() === a.call(window)
-출처
https://www.youtube.com/watch?v=QME8w1zV82g&list=PLcqDmjxt30Rt9wmSlw1u6sBYr-aZmpNB3&index=9
반응형
'JS > 인간 JS엔진' 카테고리의 다른 글
Promise, async/await (2) | 2024.01.25 |
---|---|
블록 스코프와 매개변수 (0) | 2024.01.24 |
this(this는 호출 시 결정) (1) | 2024.01.23 |
호이스팅 (0) | 2024.01.21 |
스코프 체인 (0) | 2024.01.21 |
Comments