Temporal Dead Zone (TDZ) 란?
- Temporal Dead Zone 은 줄여서 TDZ 라고 부르며 한국어로 해석하면 시간상 사각지대 정도로 해석할 수 있습니다.
let
과 const
로 선언된 변수는 var
와 같이 호이스팅을 거치지만, 초기화 전까지는 TDZ 에 들어간 변수입니다.
- TDZ 에 들어가 있는 변수를 사용하는 경우,
Reference Error
를 만나게 됩니다.
console.log(a); // 레퍼런스 에러! TDZ 에 들어간 변수입니다.
let a = 10;
typeof
와 TDZ
console.log(typeof a); // 레퍼런스 에러!
let a = 10;
typeof
연산자를 사용해도 마찬가지로 Reference Error
를 만나게 됩니다.
어휘적 스코프와 결합한 TDZ
function foo() {
var v = 3;
if (v) {
let v = v + 3; // 레퍼런스 에러!
}
}
- 레퍼런스 에러가 발생하는 이유는
let
으로 선언한 v
가 호이스팅 되어, var
로 선언한 v
가 아닌 let
으로 선언한 v
를 사용하려 해서 입니다.
function go(n) {
// 이 n은 매개변수 n
console.log(n); // Object {a: [1,2,3]}
for (let n of n.a) {
// 레퍼런스 에러!
console.log(n);
}
}
go({ a: [1, 2, 3] });
- 위 코드에서 레퍼런스 에러가 발생하는 이유는
for(let n of n.a)
중 n.a
를 할 때 사용하는 n
이 for
블럭 밖의 n
이 아닌 방금 작성한 let n
을 가리키기 때문입니다.
TDZ 는 코드의 상하 위치와 관련이 있는 것이 아니라 초기화 시점과 관련이 있다.
function example() {
const fn = () => {
console.log(a); // 42
};
const a = 42;
fn();
}
example();
- 위의 코드에서
a
는 fn()
내부에서 먼저 사용됐지만, 코드 실행 시점은 const a = 42
초기화 시점 이후이기 때문에 TDZ 에 의해 에러가 나지 않는다.