JavaScript行之间保持什么状态?

tin*_*lyx 7 javascript node.js ecmascript-6 babeljs

我想知道在提交的两行JavaScript代码之间保留了哪些状态babel-node.我的困惑是因为如果你编写两行代码,你可以覆盖变量定义而不会出错.例如,babel-node --presets es2015您可以这样做:

> const a = 1;
undefined
> let a = 2;
undefined
Run Code Online (Sandbox Code Playgroud)

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

> const a = 1; let a = 2;
TypeError: repl: Duplicate declaration "a"
...
Run Code Online (Sandbox Code Playgroud)

似乎在第一种情况下,a定义为1(const变量赋值)的状态丢失(但直到第二次赋值),而在第二种情况下,它被维护.

是什么导致这里的差异?以及维护哪些州?

Tha*_*you 6

因为const并且let是新的语法,所以必须将它们转换为ES6之前唯一可用的绑定机制:var.在这种情况下,var允许各种随意的重新分配,而不会产生任何形式的警告.

因此,当您键入表达式时babel-node,babel将其转换,对其进行求值,然后显示结果.Babel可以const在转换时检查绑定的滥用,这就是为什么你会看到错误的原因const a = 1; let a = 2.但const a = 1let a = 2,transpiled /评价为单独的表达式时,不会因为巴别是不能够在任一表达单独检测问题表现出错误.


问题的更直观的演示:对于expr您在babel-nodeREPL中键入的每个表达式,这基本上就是正在发生的事情

evaluate(transpile(expr))
// => someResult
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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