일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- autosize
- dfs
- SSR
- 태그된 유니온
- async/await
- RTK Query
- React
- CORS
- 결정 알고리즘
- 무한 스크롤
- 공변성
- Promise
- map
- 타입 좁히기
- webpack
- recoil
- tailwind
- 리터럴 타입
- 투포인터
- app router
- CI/CD
- 이분 검색
- useAppDispatch
- Cypress
- ESlint
- Jest
- 호이스팅
- 반공변성
- TS
- 인터섹션
Archives
- Today
- Total
짧은코딩
블록 스코프와 매개변수 본문
반응형
분석
const x = true;
let y = false;
function a() {
let a = 4;
y = true;
if (x) {
let a = 3;
for (let i = 0; i < a; i++) {
console.log(i);
}
if (!y) {
kkk();
}
}
z(); //에러
}
a();
const z = (a, b) => {
return a + b;
};
z(3, 5);
-a()까지 호출된 호출 스택과 선언 지도
- 호출 스택
- 우선 anonymous(this=window)가 호출 스택에 들어감
- a(this=window)가 호출 스택에 들어감
- 선언 지도
- 우선 a(fn)가 호이스팅 되어서 들어가고, 그다음으로 x(true), y(false) 선언
- a(fn) 안에 a(4)가 선언, 이게 가능한 이유는 서로 다른 스코프 블록에 a가 있기 때문
- a(fn) 안에 y = true가 있어서 anonymous에 선언된 y가 true로 변경, a(fn) -> anonymous -> y이기 때문
- a(fn), if {} 블록 안에 a(3) 선언, 마찬가지로 서로 다른 스크프 블록에 a가 있기 때문
- a(fn), if {}, for 블록은 for문이 3번 돌기에 3개 선언되고, 각각 i가 다른 값을 가짐
- !y는 false라서 if (!y) 문은 무시, kkk()도 선언된 것이 없기에 무시
- z는 호이스팅은 되었지만 TDZ라서 에러가 발생
- 만약 에러를 발생시키지 않으려면 z를 화살표 함수가 아니라 function으로 선언해야 함
-a()가 끝나고 z가 호출된 호출 스택과 선언지도
a()와 관련된 호출 스택과 선언 지도에 선언된 변수들이 다 수행되고 사라짐
- 호출 스택
- z(this=window)가 호출 스택에 들어감
- 선언 지도
- anonymous에 z(fn)이 선언
- z에 있는 매개 변수도 변수기에 a(3), b(5)가 선언
-출처
https://www.youtube.com/watch?v=QME8w1zV82g&list=PLcqDmjxt30Rt9wmSlw1u6sBYr-aZmpNB3&index=10
반응형
'JS > 인간 JS엔진' 카테고리의 다른 글
비동기는 동시가 아니다 (1) | 2024.01.27 |
---|---|
Promise, async/await (2) | 2024.01.25 |
this를 분석할 수 없는 케이스 (0) | 2024.01.23 |
this(this는 호출 시 결정) (1) | 2024.01.23 |
호이스팅 (0) | 2024.01.21 |
Comments