변수의 선언과 변수의 초기화 사이의 변수에 접근할 수 없는 지점
즉, 초기화되지 않은 변수가 있는 곳을 Temporal Dead Zone이라고 한다.
몇 가지 문제를 제시하고 답을 설명하면서 이해를 돕겠다.
let letValue = 'out Scope';
function hello() {
console.log('letValue', letValue);
let letValue = 'inner scope';
};
hello()
let a = f();
const b = 2;
function f() { return b; }
{
console.log(typeof nonsenseThatDoesntExist);
console.log(typeof name);
let name = "hoo00nn";
}
답 : ReferenceError가 발생한다.
JS엔진은 코드를 수행하기 전 가장 먼저 코드에서 데이터를 위한 메모리를 설정한다. 이 과정을 호이스팅
이라 한다.
ReferenceError
발생let letValue = 'out Scope';
function hello() {
// letValue가 TDZ에 영향을 받는 구간
console.log('letValue', letValue); // ReferenceError
let letValue = 'inner scope'; // letValue가 초기화 됨으로써, TDZ가 끝나게 됩니다.
};
hello()
여기서 한 가지 더 알아두면 좋은 개념을 설명하겠다.
let, const 변수가 실제로 할당되기 전에 실행만 되지 않는다면 참조는 할 수 있습니다. (eg. 함수 내)
function hello() {
console.log('letValue', letValue);
};
let letValue = 'out Scope';
hello()
하지만 아래의 코드는 Reference error
을 유발합니다.
function hello() {
console.log('letValue', letValue);
};
hello(); // ReferenceError
let letValue = 'out Scope';
답 : ReferenceError가 발생한다.
ReferenceError 발생
let a = f(); // 1
const b = 2;
function f() { return b; } // 2, b is in the TDZ
답 : undefined 와 ReferenceError
typeof notDefined
는 undefined
로 평가한다.typeof
연산자를 사용하면 ReferenceError가 발생한다.
{
console.log(typeof notDefined);
console.log(typeof name); // ReferenceError
let name = "hoo00nn";
}
TDZ는 const, let, class 구문의 유효성에 영향을 미치는 중요한 개념이다. TDZ는 선언 전에 변수를 사용하는 것을 허용하지 않는다.