我想知道提交给 babel-node
的两行 JavaScript 代码之间保留了什么状态。我之所以感到困惑,是因为如果您编写两行代码,就可以无错误地覆盖变量定义。例如,使用 babel-node --presets es2015
,你可以:
> const a = 1;
undefined
> let a = 2;
undefined
现在如果你把它写在一行中,你会得到一个错误:
> const a = 1; let a = 2;
TypeError: repl: Duplicate declaration "a"
...
似乎在第一种情况下,a
被定义为1
(const
变量赋值)的状态丢失了(但还没有直到第二次赋值),而在第二种情况下,它被维护。
是什么导致了这里的差异?以及维持哪些状态?
最佳答案
因为 const
和 let
是新的语法,它们必须被转译为 ES6 之前唯一可用的绑定(bind)机制:var
。在这种情况下,var
允许进行各种随意的重新分配,而不会产生任何类型的警告。
因此,当您在 babel-node
中键入一个表达式时,babel 会对其进行转换、计算,然后显示结果。 Babel 可以在编译时检查是否滥用了 const
绑定(bind),这就是为什么您会看到 const a = 1; 错误的原因。让 a = 2
。但是 const a = 1
和 let a = 2
,当作为单独的表达式进行转译/求值时,不会出现错误,因为 babel 无法检测到任何一个表达式中的问题一个人。
问题的更直观的演示:对于您在 babel-node
REPL 中键入的每个表达式 expr
,这基本上就是正在发生的事情
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
关于javascript - JavaScript 行之间保持什么状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44275202/