typeof 和暂时性死区的执行分析

分析函数调用中 typeof 操作符和 let 声明的暂时性死区问题

问题

分析以下代码的执行结果:

foo(typeof a);
function foo(p) {
  console.log(this);
  console.log(p);
  console.log(typeof b);
  let b = 0;
}

解答

这段代码会抛出错误,具体执行过程如下:

第一行:foo(typeof a)

由于变量 a 未声明,typeof a 返回 "undefined"(typeof 对未声明变量不会报错)。

函数内部执行:

  1. console.log(this) - 输出全局对象(浏览器中是 Window,Node.js 中是 globalundefined,取决于严格模式)

  2. console.log(p) - 输出 "undefined"(传入的参数值)

  3. console.log(typeof b) - 抛出 ReferenceError

第三行会报错,因为 b 使用 let 声明,在声明之前访问会触发暂时性死区(TDZ)。即使使用 typeof 操作符,也无法避免这个错误。

实际输出:

Window
"undefined"
ReferenceError: Cannot access 'b' before initialization

关键点

  • typeof 对未声明的变量返回 "undefined",不会报错
  • let/const 声明的变量存在暂时性死区,在声明前访问会抛出 ReferenceError
  • 暂时性死区中使用 typeof 也会报错,这与未声明变量的行为不同
  • 函数声明会提升,所以可以在声明前调用 foo