ES6 const赋值中的意外行为

时间:2017-06-06 11:19:30

标签: javascript ecmascript-6

鉴于以下内容:

const foo = foo; // Uncaught ReferenceError: foo is not defined

尝试跟进:

const foo = 123; // Uncaught SyntaxError: Identifier 'foo' has already been declared

foo永远不会设置,Chrome和Firefox都会出现类似的行为。

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

您在这里遇到的是时间死区。变量foo已声明,但尚未初始化。实际上,您尝试将其初始化为正确,但在foo可以设置为值之前,对该表达式的求值会引发异常。现在它永远没有被初始化 - 你只有那一次机会。

这是一个已知问题。 From es-discuss(由Jason Orendorff撰写):

  

我刚刚意识到这对REPL有一个不幸的含义。假设   你犯了这个错字:

js> let x = Math.cso(a)    // oops, TypeError, should be Math.cos
     

现在x在你的REPL中无法挽回。这看起来很糟糕。

     

我想我们可以通过使REPL弯曲规则来解决这个问题   语言。但是对于在JS中实现的REPL来说,这很难做到。   也许规则应该更加宽容。