【问题标题】:What state is kept between JavaScript lines?JavaScript 行之间保持什么状态?
【发布时间】:2017-05-31 03:37:44
【问题描述】:

我想知道提交给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 定义为1const 变量赋值)的状态丢失了(直到第二次赋值),而在第二种情况下,它保持不变.

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

【问题讨论】:

    标签: javascript node.js ecmascript-6 babeljs


    【解决方案1】:

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

    因此,当您在 babel-node 中键入表达式时,babel 会对其进行转换、评估,然后显示结果。 Babel 可以在编译时检查 const 绑定的滥用,这就是为什么您会看到 const a = 1; let a = 2 的错误。但是 const a = 1let 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
    

    【讨论】:

      【解决方案2】:

      我不使用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
      

      【讨论】:

      • 发现babel-node 是罪魁祸首——原版的node repl 没有出现这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多