鉴于以下内容:
const foo = foo; // Uncaught ReferenceError: foo is not defined
尝试跟进:
const foo = 123; // Uncaught SyntaxError: Identifier 'foo' has already been declared
foo
永远不会设置,Chrome和Firefox都会出现类似的行为。
这里发生了什么?
答案 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来说,这很难做到。 也许规则应该更加宽容。