JavaScript行之间保持什么状态?

我想知道在提交给babel-node两行JavaScript代码之间保留了哪些状态。 因为如果你写了两行代码,你就可以覆盖一个没有错误的variables定义。 例如,用babel-node --presets es2015 ,你可以这样做:

 > const a = 1; undefined > let a = 2; undefined 

现在如果你把它写在一行中,你会得到一个错误:

 > const a = 1; let a = 2; TypeError: repl: Duplicate declaration "a" ... 

似乎在第一种情况下, a被定义为1constvariables赋值)的状态丢失(直到第二个赋值),而在第二种情况下,它被保留。

是什么导致了这里的差异? 和哪些国家维持?

由于constlet是新的语法,因此必须将它们转换为在ES6之前可用的唯一绑定机制: var 。 在这种情况下, var允许各种各样的随意重新分配,而不会产生任何警告。

所以,当你在babel-nodeinput一个expression式时,babel会传递它,对它进行评估,然后显示结果。 Babel可以检查在transpile时间是否滥用const绑定,这就是为什么你看到const a = 1; let a = 2的错误const a = 1; let a = 2 const a = 1; let a = 2 。 但是const a = 1并且let a = 2 ,当作为单独的expression式进行转译/计算时,不会显示错误,因为babel无法单独检测任何一个expression式中的问题。


这个问题的更直观的演示:对于每个expression式expr你在babel-node REPL中键入,这基本上是发生了什么

 evaluate(transpile(expr)) // => someResult 

所以你不会在这里看到一个错误

 evaluate(transpile('const a = 1')) evaluate('var a = 1') // bind a to 1 // return undefined evaluate(transpile('let a = 2')) evaluate('var a = 2') // bind a to 2 // return undefined 

但是你会在这里看到一个错误

 evaluate(transpile('const a = 1; let a = 2')) // ERROR during transpile: const a has already been declared 

我不使用babel-repl ,但它必须与正在进行的转换有关,因为一切REPL都可以像预期的那样工作:

 $ node -v v7.4.0 $ node > const a = 1; undefined > let a = 1; SyntaxError: Identifier 'a' has already been declared > const b = 1; let b = 1; const b = 1; let b = 1; ^ SyntaxError: Identifier 'b' has already been declared > .editor // Entering editor mode (^D to finish, ^C to cancel) const c = 1; let c = 1; let c = 1; ^ SyntaxError: Identifier 'c' has already been declared