ES6中的typeof会抛出一个错误。

5

ES5中typeof被视为安全的,因为当检查非声明值时,它不会抛出ReferenceError,例如:

console.log(typeof undeclaredVar); // undefined

然而,在ES6中检查typeof undeclaredLetConst时,只有在后来使用letconst声明了该变量时,才会抛出错误。如果使用var声明,则不会出现错误。

console.log(typeof undeclaredLetConst);
let undeclaredLetConst = "hello";  // ReferenceError

那里发生了什么?

1个回答

12

为什么在 var 声明中有效

当 JavaScript 引擎查找词法作用域块并发现一个使用 var 声明的变量时,它会将声明提升到函数的顶部(或全局作用域,如果没有出现 "use strict")。

因此,typeof 永远不会失败,因为它所检查的变量将先被提升。

暂时性死区 (TDZ)

TDZ 从来没有在 ECMAScript 规范中显式地命名过,但这个术语用于描述为什么 letconst 声明在声明之前是不可访问的。

为什么在 constlet 声明中无效

当 JavaScript 引擎查找词法作用域块并发现一个使用 letconst 声明的变量时,它会将声明放置在 TDZ 中。任何尝试访问 TDZ 中的变量都会导致运行时错误。

在流程达到声明本身时,声明将从 TDZ 中移除。

console.log(typeof undeclaredLetConst);     // "undefined"

if (1) {
    let undeclaredLetConst = "no errors!";
}

undeclaredLetConst在执行typeof操作时不在TDZ中,因为它出现在声明undeclaredLetConst的块外。这意味着没有值绑定,并且typeof只会返回“undefined”。

来源:Nicholas C. Zakas的一本很棒的书,《理解ECMAScript 6》。


我想要问的问题是,TDZ 对于简单的引用是可以的,但为什么要使用 typeof - doubleOrt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接