babel是否为let绑定生成了微妙的错误代码



我看到了本机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声明的变量,它将只具有未定义的值)

所以我想知道:

  1. 这是故意的吗?我有没有遗漏一些方面
  2. 有没有一种方法可以获得编译时失败,而不是运行时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规则检测它。

最新更新