ES6 typeof会抛出错误

时间:2016-09-10 15:38:05

标签: javascript node.js ecmascript-6

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

console.log(typeof undeclaredVar); // undefined

但是,在es6中检查typeof undeclaredLetConst时,如果稍后使用letconst声明该值,则会引发错误 。如果用var声明它将正常工作。

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

那里发生了什么?

1 个答案:

答案 0 :(得分:11)

为什么它适用于var声明

当JavaScript引擎查看词法范围块并找到带有var的变量声明时,它会将声明提升到函数的顶部(如果不存在"use strict",则将全局范围提升)。

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

时间死区(TDZ)

  

TDZ 永远不会在ECMAScript规范中明确命名,但该术语用于描述为什么let和const声明在声明之前无法访问。

为什么它失败了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。