ES6 typeof引发错误
ES5 typeof
被认为是安全的,因为当再次检查一个非声明的值时,它不会抛出ReferenceError
。 如
console.log(typeof undeclaredVar); // undefined
然而,当在es6中检查type of undeclaredLetConst时, 只有稍后使用let
或const
声明值时才会抛出错误。 如果它声明与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引擎通过一个词法作用域块来查找,并用let
或const
find一个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。