暂时性死区(TDZ)指块级作用域开始到let/const声明执行前的区域,此时访问变量会抛出ReferenceError;其本质是变量被提升但未初始化,运行时禁止任何读写操作,包括typeof检测。

在 JavaScript 基础中,“暂时性死区”(Temporal Dead Zone,简称 TDZ)是指从块级作用域开始到 let 或 const 声明语句执行前的这一段区域。在这段区域内访问该变量,会抛出 ReferenceError,而不是返回 undefined。
TDZ 的本质是“声明未初始化”
let 和 const 声明的变量虽然会被提升(hoisted),但不会像 var 那样被初始化为 undefined。它们在声明前处于“未初始化”状态,JavaScript 引擎明确禁止读写——哪怕只是 typeof 检查也会报错。
-
var a;→ 提升并初始化为undefined,访问不报错 -
let b;→ 提升但不初始化,b在声明前处于 TDZ,访问即报ReferenceError
常见触发 TDZ 报错的场景
以下代码都会在运行时抛出 ReferenceError:
- 在
let/const声明前使用变量:console.log(x); let x = 10; - 用
typeof检测尚未声明的let变量:typeof y;(y 是let y)→ 报错(注意:对var则返回"undefined") - 函数参数默认值中引用尚未初始化的同名变量:
let x = x;(在参数列表或函数体内) - 类内部方法中提前访问
this.xxx(若xxx是let/const声明在构造函数后)
TDZ 与块级作用域和执行时机强相关
TDZ 不是静态语法检查,而是在运行时动态判断的。它的起始点是块(如 {}、if、for、函数体等)开头,结束于对应 let/const 声明语句执行完成那一刻。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
{ console.log(a); let a = 1; }→ 报错,因为a在整个块开头就进入 TDZ -
if (false) { let b; } console.log(b);→ 不报错?错!b只在 if 块内声明,外部根本不可见,此处是ReferenceError: b is not defined(作用域问题,非 TDZ)
如何避免 TDZ 导致的 ReferenceError
核心原则:**确保在 let/const 声明之后再访问它**。实践中可:
- 把变量声明尽量放在块的顶部(显式体现顺序依赖)
- 避免在声明前做任何读取操作,包括
console.log、typeof、条件判断等 - 理解
const必须在声明时赋值,所以其 TDZ 范围更短(声明即初始化),但依然存在 - 用工具(如 ESLint)开启
no-use-before-define等规则辅助检测
TDZ 不是 bug,而是 JavaScript 为修复 var 的变量提升混乱而设计的严谨机制。它让“未声明就使用”的行为更早暴露,提升代码可读性与可维护性。

















