5月27日 01:17

JavaScript 的暂时性死区是什么?

暂时性死区(TDZ)是 letconst 的特性:从块级作用域开始到变量被声明为止,这个区间内访问变量会抛 ReferenceError

javascript
console.log(x); // undefined — var 提升但不报错 var x = 1; console.log(y); // ReferenceError — let 有 TDZ let y = 2;

let/const 确实有变量提升(引擎知道这个变量存在于作用域中),但在声明语句之前,这个绑定处于"未初始化"状态——这就是 TDZ。var 提升后直接被初始化为 undefined,所以能用。

TDZ 的意义:帮你发现"在声明前就使用变量"的错误——这种 bug 用 var 时会被悄悄忽略。

追问

typeof 在 TDZ 中也会报错吗?

会。typeof x 在 x 的 TDZ 中直接 ReferenceError。这是 typeof 唯一不安全的场景——通常 typeof 未声明变量 返回 "undefined" 不会报错,但 TDZ 是"已声明但未初始化",typeof 也会报错。

TDZ 对函数参数的默认值有影响吗?

有。参数默认值中引用的后面的参数,会遇到 TDZ:

javascript
function fn(a = b, b = 1) {} // a 的默认值引用 b 时,b 还在 TDZ 中 fn(); // ReferenceError
标签:前端