ES6 typeof引发错误

ES5 typeof被认为是安全的,因为当再次检查一个非声明的值时,它不会抛出ReferenceError 。 如

 console.log(typeof undeclaredVar); // undefined 

然而,当在es6中检查type of undeclaredLetConst时, 只有稍后使用letconst声明值时才会抛出错误。 如果它声明与var它将正常工作。

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

那里发生了什么?

为什么它与var声明一起工作

当一个JavaScript引擎通过一个词法作用域块查找,并find一个var的variables声明时,它将声明提升到函数的顶部(如果不存在"use strict" ,则提升到全局范围)。

因此,这种types将永远不会失败,因为它的检查variables将被提前悬挂。

时空死亡区(TDZ)

TDZ在ECMAScript规范中从来没有被明确地命名,但是这个术语用来描述为什么let和const声明在声明之前是不可访问的。

为什么它与const失败并let

当一个JavaScript引擎通过一个词法作用域块来查找,并用letconstfind一个variables声明时,它将声明放在TDZ中 。 任何尝试访问TDZ中的variables都会导致运行时错误。

一旦stream程到达声明本身,声明将在运行时TDZ中删除。

 console.log(typeof undeclaredLetConst); // "undefined" if (1) { let undeclaredLetConst = "no errors!"; } 

undeclaredLetConst在执行typeof操作时不在TDZ中 ,因为它发生在undeclaredLetConst的块之外。 这意味着没有值绑定,而typeof只是返回“undefined”。

来源: Nicholas C. Zakas撰写的一本很棒的书,了解ECMAScript 6。