[Javascript] TDZ (Temporal Dead Zone)
JS TDZ, Temporal Dead Zone, 일시적 사각지대
정의
TDZ (Temporal Dead Zone) 는 let/const/class 선언이 호이스팅된 시점부터 선언문 (실행) 직전까지 의 접근 불가 구간.
{
// ↓ TDZ 시작
console.log(x); // ❌ ReferenceError
let x = 1; // ← TDZ 끝
console.log(x); // ✓ 1
}
var 와의 비교
console.log(a); // undefined (var 는 TDZ 없음)
var a = 1;
console.log(b); // ReferenceError
let b = 1;
var 는 호이스팅 시 자동으로 undefined 초기화, let/const 는 미초기화 상태 (TDZ).
TDZ 의 의미
이름이 헷갈리는 부분: “호이스팅된 시점부터 선언문까지” 라는 시간적 (temporal) 사각지대. 코드 위치가 아닌 실행 시점 기준.
function foo() {
return x;
}
// foo() 를 여기서 호출하면 ReferenceError
foo(); // ❌
let x = 1;
// 여기서는 OK
foo(); // ✓ 1
호이스팅된 변수가 같은 스코프 안에서 발견되지만, 선언문 실행 전까지는 사용 불가.
class 도 TDZ
new Foo(); // ❌ ReferenceError
class Foo {}
class 도 let/const 와 같은 TDZ.
함수 매개변수 default 의 TDZ
function foo(a = b, b = 1) { // ❌ b 가 a 의 default 에서 TDZ
return a;
}
foo();
매개변수도 왼쪽부터 평가, 뒤에 있는 매개변수는 앞 매개변수의 default 안에서 TDZ.
함정
1. typeof 가 안전한 함정
console.log(typeof undeclared); // 'undefined' (안전)
console.log(typeof x); // ❌ ReferenceError
let x = 1;
typeof 가 일반적으로 안전한 검사지만, TDZ 안의 let/const 에는 적용 안 됨.
2. 같은 스코프의 같은 이름
let x = 1;
{
console.log(x); // ❌ ReferenceError (x 가 호이스팅되어 안쪽 스코프 가림)
let x = 2;
}
안쪽 블록의 let x 가 호이스팅되어 바깥의 x 를 가린다. 그 결과 TDZ.
3. for-of, for-in 의 let
for (let item of arr) { ... }
// 매 반복마다 새 binding (안전)
var item 은 같은 변수, let item 은 매 반복 새 변수 → 클로저 안전.
모범 사례
- 선언을 사용 직전에, TDZ 진입 회피
- scope 최상단에 모든 선언 같은 옛 스타일 피하기
const우선, 재할당 의도 명확
참고
이 글의 용어 (3개)
- [Javascript] 스코프 체인javascript
- 정의 스코프 체인 (Scope Chain) 은 변수 식별자를 해결할 때 따라가는 중첩된 의 연결 구조. 안쪽 스코프에서 찾지 못한 변수를 바깥 스코프로 차례로 검색. 시각화 변수…
- [Javascript] 호이스팅 (Hoisting)javascript
- 정의 호이스팅 (Hoisting) 은 JavaScript 엔진이 코드 실행 전에 선언을 스코프의 최상단으로 끌어올리는 동작. 단, / 는 로 접근 제한. var 의 호이스팅 엔진…
- [Javascript] var / let / constjavascript
- 정의 JavaScript 의 3 가지 변수 선언 키워드. | 키워드 | 스코프 | 재할당 | 재선언 | 호이스팅 | |:---|:---|:---:|:---:|:---| | | f…
💬 댓글