Frontend/JavaScript

Temporal Dead Zone 줄여서 TDZ !

섕걍 2022. 6. 3. 23:35

 

우선 호이스팅을 알아보자

쉽게 말하면

스코프 내부 어디에서든 변수'선언'최상위에 선언된것처럼 행동하는것이다.

으로 정리 할 수 있고

 

MDN정의를 정리하면 아래와 같다.

인터프리터가 변수와 함수의 메모리공간선언전 미리 할당하는 것을 의미한다.

즉 선언 전에 미리 할당하는것이다

그렇기 때문에 

let과 const도 호이스팅 된다는것이다 :)

 

 

그렇다면 var로 선언한 a는 undefined로 동작하는것은 알겠는데

console.log(a); //undefined

var a ;

let으로 선언한 b는 왜 ReferenceError가 발생하는 것일까?

너두 호이스팅 된다면서!

console.log(b); 
//ReferenceError: b is not defined
let b;

이유는 TDZ Temporal Dead Zone에 있었다!

TDZ는 스코프의 시작 지점부터 초기화 시작지점까지의 구간을 말한다.

 

TDZ를 이해하기전에 변수 생성의 3단계부터 알아보자


 

변수의 생성과정 3단계

1. 선언단계

2. 초기화 단계 // undefined

3. 할당 단계 // 값 할당

 

이렇게 3단계를 거쳐 변수가 생성이 된다.

 

2번 초기화 단계에서 undefined로 초기화된다.

3번에서 undefined로 초기화된 메모리에 값을 할당한다.

 

var ,let, const는 생성과정이 각자 다르다


var 의 변수 생성과정

1. 선언 + 초기화 단계

2. 할당 단계

let 의 변수 생성과정

1. 선언 단계

2. 초기화 단계

3. 할당 단계

const 의 변수 생성과정

1. 선언 + 초기화 + 할당 단계


이제 다시 TDZ로 돌아와서

 

var 로 선언했을때 아래의 코드를 다시 봤을때 

console.log(age); 
var age;

 

var로 선언된 변수의 생성과정을 보면

1. 선언 + 초기화

2. 할당

의 과정을 갖는다.

 

var age는 호이스팅되어 메모리에 할당됨과 동시에 초기화가 되어

undefined로 할당이 되어있기 때문에

undefined로 출력되는것이다.

 

console.log(age);
let age;

 

let 의 변수 생성과정을 다시 생각해보면

1. 선언

2. 초기화

3. 할당

과정을 갖는다.

 

let 으로 만든 age는 선언만 되어있고 => 호이스팅은 되어있는상태 (메모리에 할당)

console.log로 실행하려고 했을때 초기화가 되어있지 않기 때문

ReferenceError가 발생하는 것이다.

즉 초기화 전에 접근을 했기 때문에 Reference Error가 발생한것이다.

 

이렇게 초기화전에 접근해Reference Error를 발생하는 구간

변수 선언 ~ 초기화 하기 전 사이를 TDZ상태라고 하는것이다.


코드 작성 순서가 아니라

코드의 실행 순서를 이해해야 하기 때문에

어려운 개념이었지만

재밌었당

 

끄읕

지적 환영~

하지만 부드럽게 말해야함ㅎ

'Frontend > JavaScript' 카테고리의 다른 글

프로토타입을 이해해보자  (0) 2022.06.09
window.requestAnimationFrame() 너 누구 야  (0) 2022.06.05
Set 에 대해 알아보자..  (0) 2022.06.02
Element.getBoundingClientRect()  (0) 2022.05.17
String.prototype.charAt()  (0) 2022.04.18