暂时性死区(TDZ)是let/const声明在块级作用域中从块开头到声明语句执行完成前的不可访问区间,访问会抛出ReferenceError;它源于声明提升但不初始化的机制,非语法错误而是运行时错误。

JavaScript 中的暂时性死区(Temporal Dead Zone,TDZ)并不是一种主动“限制访问”的机制,而是 let 和 const 声明在块级作用域中自然产生的行为表现:在变量声明语句执行前,该变量处于不可访问状态,任何读写操作都会抛出 ReferenceError。
TDZ 的触发条件
它只对 let 和 const 生效,且严格绑定到块级作用域(如 {}、if、for、函数体等)。只要变量尚未被声明语句执行,就处于 TDZ 中。
- 不是语法错误,是运行时错误——代码能解析通过,但执行到访问点时报错
- TDZ 范围从块开头开始,到声明语句执行完成为止
-
typeof 检查也会触发错误(不同于 var 的
"undefined")
典型 TDZ 报错场景
以下代码都会在进入块后立即报错:
{
console.log(a); // ReferenceError: Cannot access 'a' before initialization
let a = 1;
}
即使在声明之后的另一行,只要执行流还没走到那条 let,就仍在 TDZ 中。嵌套块也独立计算 TDZ:
立即学习“Java免费学习笔记(深入)”;
if (true) {
console.log(b); // ❌ 报错
let b = 2;
{
console.log(b); // ✅ 正常,已声明
console.log(c); // ❌ 报错,c 在内层块中尚未声明
const c = 3;
}
}
如何避免 TDZ 问题
本质是养成“先声明、后使用”的习惯,尤其注意作用域边界:
- 把 let/const 声明尽量放在块的顶部,显式表明意图
- 避免在声明前调用函数(函数内部若访问该变量,仍会报错)
- 不要依赖
typeof来检测 let/const 变量是否存在 - 用 var 不会触发 TDZ(有变量提升和默认初始化为
undefined),但会失去块级作用域优势,不推荐用于替代
TDZ 与变量提升的区别
var 是“声明提升 + 初始化为 undefined”,所以可以安全读取;let/const 是“声明提升但不初始化”,提升后留空,直到执行到声明语句才赋值——这个“留空区间”就是 TDZ。
它不是设计来“限制访问”的工具,而是语言为保障 const 不可变性和 let 更可靠的作用域行为所做出的必要约束。


















