일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- useAppDispatch
- Jest
- 반공변성
- CI/CD
- Cypress
- CORS
- 이분 검색
- 인터섹션
- 투포인터
- 리터럴 타입
- RTK Query
- recoil
- 타입 좁히기
- SSR
- ESlint
- webpack
- app router
- autosize
- 결정 알고리즘
- 태그된 유니온
- Promise
- async/await
- TS
- dfs
- tailwind
- 무한 스크롤
- 공변성
- React
- map
- 호이스팅
Archives
- Today
- Total
짧은코딩
호이스팅 본문
반응형
좋은 개발을 하려면 호이스팅을 하지 않는 것이 가장 좋다!
분석 코드
const x = "x";
console.log(z);
var y = "hehe";
const z = () => {};
function c() {
const y = "y";
console.log("c");
function b() {
const z = "z";
console.log("b");
c();
}
}
function a() {
const x = "x";
console.log("a");
}
a();
c();
이런 코드가 있을 때, 호이스팅 상황에서 어떻게 되는지 분석해보겠다.
var
const x = "x";
console.log(z);
var y = "hehe";
이런 코드가 호이스팅 되면
var y;
const x = "x";
console.log(z);
y = "hehe";
선언만 맨 위로 올라간다.
그리고 var은 같은 이름으로 중복 선언이 가능하다.
-var을 사용하지 않아야하는 정확한 이유
(const와 let이 var보다 좋다는 이유는 근거가 빈약하다.)
=> var은 코드 분석을 헷갈리게 만든다.
- 선언만 위로 올라간다.
- 중복 선언이 된다.
- 결국 직관적이지 못하다.
function
var y;
function c() {
const y = "y";
console.log("c");
function b() {
const z = "z";
console.log("b");
c();
}
}
function a() {
const x = "x";
console.log("a");
}
const x = "x";
console.log(z);
y = "hehe";
const z = () => {};
a();
c();
function들은 전체가 다 올라간다.
const, let
const와 let도 호이스팅이 되긴하지만 여기선 TDZ(Temporal Dead Zone)이란 개념이 등장한다.
// z에 대한 TDZ 시작
var y;
function c() {
const y = "y";
console.log("c");
function b() {
const z = "z";
console.log("b");
c();
}
}
function a() {
const x = "x";
console.log("a");
}
const x = "x";
console.log(z); // 에러
y = "hehe";
// z에 대한 TDZ 끝
const z = () => {};
a();
c();
- z에 대한 TDZ가 있고, z보다 위에서 z에 접근하면 에러가 발생
- 이런 이유로 웬만하면 function보단 화살표 함수를 쓰는 것이 좋다. 하지만 function은 통채로 올라가서 헷갈리진 않는다.
- 또 const, let를 TDZ에서 사용하지 않는 것이 좋다.
문제
-1번
function a() {
console.log(z);
}
const z = 'z1';
a();
이 코드의 정답은?
더보기
답
'z1'
선언 지도
anonymous -> a, z
TDZ는 함수 내부까지 영향을 미치진 않는다.
그리고 a -> anoymous(a, z), anoymous에서 z를 갖고 있기에 a에서 접근이 가능하다.
-2번
function a() {
console.log(z);
}
a();
const z = 'z1';
이 코드의 정답은?
더보기
답
에러
a가 TDZ에서 호출되었기 때문이다.
-출처
https://www.youtube.com/watch?v=fLZ-bKT4sFs&list=PLcqDmjxt30Rt9wmSlw1u6sBYr-aZmpNB3&index=6
반응형
'JS > 인간 JS엔진' 카테고리의 다른 글
this를 분석할 수 없는 케이스 (0) | 2024.01.23 |
---|---|
this(this는 호출 시 결정) (1) | 2024.01.23 |
스코프 체인 (0) | 2024.01.21 |
호출 스택 분석 (0) | 2024.01.20 |
함수와 함수의 호출, 고차함수 (0) | 2024.01.20 |
Comments