暂时性死区(tdz)是let/const变量已绑定但未初始化的运行时访问禁区,从块作用域开始到声明语句执行完毕,期间访问会抛referenceerror。

暂时性死区(Temporal Dead Zone,TDZ)不是“变量还没声明”,而是“变量已经存在,但还不让用”。它专属于 let 和 const,是 JavaScript 引擎在块级作用域内强制执行的一段访问禁区。
TDZ 的起点和范围由作用域决定
只要进入一个有 let/const 声明的块(比如函数体、{}、模块顶层),TDZ 就立刻开始,一直持续到对应变量的声明语句执行完毕。
- 全局脚本中:从脚本加载起,到
let x = 1这行真正执行完为止 - 函数内部:从函数被调用、执行流进入第一行起,直到
let y那行运行结束 - 代码块内:
if (true) { console.log(a); let a = 2; }中,a的 TDZ 就是{到let a = 2;之间
TDZ 是绑定与初始化分离的结果
引擎在作用域创建阶段就为 let/const 登记变量名(即完成“绑定”),但不给初始值;只有执行到声明语句时,才完成“初始化”。中间这段“已绑定、未初始化”的状态,就是 TDZ。
-
let a;单独写也会触发 TDZ——只要声明出现,TDZ 就存在,直到该语句执行完 -
const b;直接语法报错,因为 const 必须带初始化,所以它的 TDZ 实际上更短,但规则一致 -
var c;没有 TDZ,因为它声明即初始化为undefined
TDZ 是运行时限制,不是语法错误
代码能正常解析,也能进入执行阶段;报错只发生在“试图访问一个处于 TDZ 中的变量”那一瞬间。
-
console.log(a); let a = 1;→ 报ReferenceError -
typeof a;同样报错——TDZ 让typeof不再安全 - 哪怕变量在外层作用域已声明,当前块内未声明前仍不可访问
它不是设计缺陷,而是语言规范对变量生命周期的明确约束,目的是避免未初始化就使用的隐患。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











