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 对未声明变量不会报错)。
函数内部执行:
-
console.log(this)- 输出全局对象(浏览器中是Window,Node.js 中是global或undefined,取决于严格模式) -
console.log(p)- 输出"undefined"(传入的参数值) -
console.log(typeof b)- 抛出 ReferenceError
第三行会报错,因为 b 使用 let 声明,在声明之前访问会触发暂时性死区(TDZ)。即使使用 typeof 操作符,也无法避免这个错误。
实际输出:
Window
"undefined"
ReferenceError: Cannot access 'b' before initialization
关键点
typeof对未声明的变量返回"undefined",不会报错let/const声明的变量存在暂时性死区,在声明前访问会抛出 ReferenceError- 暂时性死区中使用
typeof也会报错,这与未声明变量的行为不同 - 函数声明会提升,所以可以在声明前调用
foo
目录