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

面试中讲清楚「暂时性死区(TDZ)」,关键不是背定义,而是说清现象、原因和影响,让面试官看到你理解底层逻辑。
什么是暂时性死区
TDZ 指的是:在块级作用域内,只要存在 let 或 const 声明,那么从该作用域开始到声明语句执行前的这段区域,就是该变量的“死区”。在这个区域内访问该变量,会直接抛出 ReferenceError,而不是返回 undefined。
- 它不是语法错误,是运行时错误
- 只对
let和const生效,var没有 TDZ - 死区范围是整个块(比如
{}、函数体、if 分支等),不局限于某一行
为什么会有暂时性死区
本质是语言设计选择:ES6 要求「先声明后使用」,避免因变量提升带来的隐蔽 bug。而 let/const 不提升,但解析器仍会在进入作用域时为其「预留绑定」——只是暂不初始化,直到执行到声明语句那一行才真正赋值。
- 对比
var:声明和赋值被拆开,声明提升,赋值留在原地 → 可访问但值为undefined -
let/const:声明与初始化不可分离,未到声明行就访问 → 直接报错 - 典型陷阱:函数参数默认值引用尚未声明的同级变量
怎么举例说明更专业
别只写 console.log(a); let a = 1 这种基础例子。可以分层展示:
-
基础块级死区:
{ console.log(tmp); let tmp = 'ok'; }→ 报错 -
函数参数中的 TDZ:
function foo(x = y, y = 2) { return [x, y]; }→ 调用foo()报错,因为x默认值试图读取还未初始化的y -
循环中易忽略的死区:
for (let i = 0; i → 第二个let i在同一块内重复声明,且首次console.log(i)处于其 TDZ 中
回答时顺便带出设计意图
可以自然收尾说一句:TDZ 看似增加限制,实则是为了增强代码可预测性。它强制开发者明确变量生命周期,减少因顺序误判导致的静默错误,也支撑了 let/const 的块级作用域语义一致性。











