暂时性死区(tdz)指块级作用域中从进入该块到let/const声明执行前变量不可访问的状态;此时任何读写或typeof检测均抛出referenceerror,且仅存在于含let/const的最小封闭块内。

块级作用域中暂时性死区(TDZ)的触发,核心在于“有 let 或 const 声明” + “在声明语句执行前访问该变量”。它不是靠代码结构自动开启,而是由声明本身动态划定的。
触发 TDZ 的两个硬性条件
只有同时满足以下两点,TDZ 才会被激活:
-
作用域必须是块级作用域:即由
{}明确围出的区域,比如if、for、while语句体,或显式花括号块({ let x = 1; });函数体或全局脚本不属于 TDZ 的作用范围主体(除非内部含块)。 -
该块内存在 let 或 const 声明:只要出现哪怕一个
let x或const y = 1,整个块从顶部开始就对这些变量形成 TDZ——不是从声明行开始,而是从块首起算。
为什么 var 不会触发 TDZ
var 声明会把声明和初始化(默认为 undefined)一起提升到作用域顶部,所以即使写在后面,前面也能读到 undefined。而 let/const 虽然也“被声明感知”(语法解析阶段已注册变量名),但初始化动作严格绑定在声明语句执行时。中间这段“已知其名、未赋其值”的间隙,就是 TDZ。
常见误触 TDZ 的写法
这些情况都会立即报 ReferenceError:
-
console.log(a); let a = 1;(块顶访问未声明完成的let) -
typeof a; let a;(TDZ 中连typeof都不放过) -
if (true) { console.log(b); const b = 2; }(if块内,声明前访问) -
{ let x; x = 1; }中若在let x;前写任何对x的读写(包括let x;这行本身之前)
TDZ 的边界是动态且精确的
它只存在于“含 let/const 的最小封闭块”内部,不会跨块泄漏。例如:
嵌套块中,外层块的 TDZ 不影响内层;内层新声明的 let 会创建自己的 TDZ,从内层块开头算起。换句话说,TDZ 不是静态语法区域,而是运行时每个块级作用域中,针对每个 let/const 变量独立计算的一段“不可用时间窗口”——从块进入那一刻,到对应声明语句执行完毕为止。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











