3 回答
TA贡献1883条经验 获得超3个赞
您的问题的答案在您的标题中:变量位于“时间死区”中,这只是您所看到的行为的名称。
与以
var
undefined 开头的变量声明的变量不同,let
变量在其定义被评估之前不会被初始化。在初始化之前访问变量会导致ReferenceError
. 从块的开始到处理初始化,变量都处于“时间死区”。
块的开始是开头{
和你的console.log(a)
comes beforelet
语句,所以它在这个“死区”。
为什么会这样?因为它可以帮助程序员检测由于在不同范围内具有相同名称的变量之间的混淆而导致的代码错误。
TA贡献1765条经验 获得超5个赞
嵌套块将创建一个新的块作用域词法环境。
内部a变量在该范围内声明,但在初始化之前访问,因此出现错误。
内部范围let a声明覆盖了var a声明,所以它是一个不同的变量,就像你这样写一样:
var a = 6;
{
console.log(a2)
let a2 =55
}
TA贡献1854条经验 获得超8个赞
除了上述两个答案之外,该语句let a = 55实际上是两个语句合二为一:let a- 声明 - 和a = 55- 赋值。由于 Javascript 的提升规则,声明在进入块时处理,但赋值保留其词法位置。
所以块:
var a = 6
{
console.log(a)
let a = 55
}
在语义上等同于:
var a = 6
{
let a
console.log(a)
a = 55
}
因为局部声明a屏蔽了同名的全局变量,到console.log(a)执行时a已经声明但还没有赋值。
添加回答
举报