暂时性死区(TDZ)是JavaScript中let/const变量从块作用域起始到声明语句执行前的不可访问区域,期间任何访问均抛出ReferenceError;它强化块级作用域安全性,区别于var的提升后返回undefined。

暂时性死区(Temporal Dead Zone,TDZ)不是用来“限制”变量访问的机制,而是JavaScript引擎对let和const声明变量时的一种行为约束——它**自然阻止在声明前访问变量**,从而强化块级作用域的安全边界。
什么是暂时性死区
从块开始到变量实际声明语句之间的区域,就是暂时性死区。在这段区域内,变量已进入作用域但尚未初始化,任何读写操作都会触发ReferenceError。
例如:
if (true) {
console.log(x); // ReferenceError!
let x = 10;
}
TDZ如何配合块级作用域生效
TDZ的存在让块级作用域更严格:不仅变量出块不可见,连“在块内但声明前”也不可访问。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 块级作用域由
{}定义,let/const绑定只在该块内有效 - TDZ从块首开始,到
let/const语句执行为止,覆盖整个声明前区域 - 哪怕变量声明在块中间,块开头到那行之间都属于TDZ
- 嵌套块中,每个
let/const都有自己的TDZ,互不影响
与var提升的关键区别
var变量会被提升且初始化为undefined,所以声明前访问得到undefined;而let/const在TDZ中根本不可触达。
对比:
console.log(a); // undefined
vara = 1;
console.log(b); // ReferenceError
let b = 2;
实际编码中的注意事项
避免在块首就依赖后续才声明的let/const变量,尤其注意条件分支、循环体内的提前引用。
- 把变量声明尽量放在块顶部,符合可读性和TDZ安全要求
- 不要在
if或for块内,用let声明后又在前面逻辑中尝试访问 - 函数参数默认值中若引用
let变量,也会触发TDZ错误 -
typeof也不能绕过TDZ:typeof x在x的TDZ内同样报错

















