5月27日 01:17
JavaScript 的暂时性死区是什么?
暂时性死区(TDZ)是 let 和 const 的特性:从块级作用域开始到变量被声明为止,这个区间内访问变量会抛 ReferenceError。
javascriptconsole.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:
javascriptfunction fn(a = b, b = 1) {} // a 的默认值引用 b 时,b 还在 TDZ 中 fn(); // ReferenceError