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
被定义为1
( const
variables赋值)的状态丢失(直到第二个赋值),而在第二种情况下,它被保留。
是什么导致了这里的差异? 和哪些国家维持?
由于const
和let
是新的语法,因此必须将它们转换为在ES6之前可用的唯一绑定机制: var
。 在这种情况下, var
允许各种各样的随意重新分配,而不会产生任何警告。
所以,当你在babel-node
input一个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