temporal dead zone

Posted by yunki kim on July 10, 2021

TDZ(Temporal Dead Zone)

  다음과 같은 코드가 있다고 해보자

1
2
const a = 1;
a;//1
cs
1
2
3
a//throws 'Reference error'
const a = 1;
a;//1
cs

첫번째 예시에서는 제대로 된 결과가 나오고 두번째 예시에서는 reference error가 뜬다. 두번째 예시에서 1줄이 TDZ이다.

TDZ는 변수를 선언하기 이전에 변수를 엑세스 하는 것을 금한다.

다음과 같은 statement는 TDZ의 영향을 받는다.

  1. const, let

  2. class statement, construcotr() 내부에 있는 super()

  3. Default function parameters

 

다음은 hoisting으로 인해 영향을 받지 않는 것들이다

  1. var

  2. function 

  3. import modules

 

typeof와 TDZ

  만약 정의되지 않은 변수를 typeof하면 undefined가 출력된다. 하지만 TDZ에서 typeof를 하게 되면 ReferenceError가 뜬다. 이 이유는 변수가 아래에 정의되 있기 때문이다

1
2
typeof val;
let val;
cs

 

TDZ와 scope

  TDZ는 선언문이 존재하는 스코프 범위 에서만 변수에 영향을 준다.

1
2
3
4
5
6
7
8
function func(){
    cont b = 1;
    typeof a;//undefined, function scope
    if(b == 1){//inner scope
        typeof a;
        let a;
    }
}
cs