A let
orconst
变量只能声明一次 - 也就是说,当您let <variableName>
在一个范围内时,您已经<variableName>
在该范围内声明,并且不能在该范围内再次声明它。
从先前链接的问题:
有赋值时,首先解析右边;如果右侧抛出错误,它永远不会到达左侧,并且用 let 声明的变量永远不会被正确初始化;它将永远留在非军事区/时间死区
您不能重新声明已经声明的变量,即使在初始化期间尝试赋值时抛出了错误。
但是在第 4 行,x=3 应该进行适当的分配,并且应该从 TDZ 中删除 x。但这也失败了。我不明白
变量初始化(例如,let x
运行)后,可以将其分配给。但就像你不能分配给一个变量之前它的let
初始化,你也不能分配给一个变量后,当它的初始化没有成功完成:
x = 'foo';
let x = 'bar';
错误:
未捕获的 ReferenceError:x 未定义
这与您尝试时在控制台中发生的事情相同:
let x = y
// Uncaught ReferenceError: y is not defined
// x has not been initialized, so the next line throws:
x = 'foo'
// Uncaught ReferenceError: x is not defined
x
仍然没有被初始化,所以错误是一样的。
不过,遇到这种事情很奇怪- 您只能在控制台中看到它。在普通脚本中,抛出的错误将阻止进一步执行,并且变量名称永远未初始化的事实无需担心。
以上是早期 Chrome 版本中的一个问题。但是在 Chrome 80+ 中,let
现在允许重新声明,所以错误
未捕获的语法错误:标识符“x”已被声明
不应再发生,无论先前的变量初始化是否成功: