我看到了本机es6和传输代码之间的行为差异。
根据MDN文档,这段代码应该会产生ReferenceError
,因为我试图在定义let-bound variable
之前使用它。
let a = b; //expect ReferenceError at runtime
let b = 1;
正如预期的那样,当我在本机支持es6的东西(如Chrome Developer Tools)中运行它时,运行它会产生ReferenceError
。但如果我用babel转换它,它会生成不会导致运行时错误的代码(实时演示):
"use strict";
var a = b; //no error. Both a & b are undefined
var b = 1;
传输代码的行为与MDN文档所说的相矛盾(强调矿):
在ECMAScript 2015中,
let
绑定不受Variable Hoisting
约束,这意味着let
声明不会移动到当前执行上下文。引用块中的变量在初始化导致ReferenceError
之前(与用var
声明的变量,它将只具有未定义的值)
所以我想知道:
- 这是故意的吗?我有没有遗漏一些方面
有没有一种方法可以获得编译时失败,而不是运行时ReferenceError或"undefined"的静默失败。我注意到我得到了一个绑定到一个不存在的变量的编译时错误。也许对于一个尚未声明的变量,它也可能失败?
let d = e; //compile error: e is not defined
注意:有一个相关的问题,但我认为它没有回答这个问题(或者它回答了,但我误解了)
在这个片段中
let a = b;
let b = 1;
CCD_ 9处于时间死区。这种行为不能在已编译的代码中模拟。
据我所知,Babel目前没有一个插件来警告这个TDZ问题。在可以用Babel本身处理这个问题之前,可以用ESLinterno-use-before-define
规则检测它。