3 回答
TA贡献1851条经验 获得超3个赞
您的问题的答案就在您的标题中:该变量位于“暂时死区”,这只是您所看到的行为的名称。
与使用 声明的变量不同
var
,变量将以未定义的值开始,let
变量在其定义被求值之前不会被初始化。在初始化之前访问变量会产生ReferenceError
. 从块开始直到处理初始化为止,该变量处于“临时死区”。
块的开始是开头{
,您的console.log(a)
来之前let
声明,因此它位于这个“死区”。
为什么会这样呢?因为它可以帮助程序员检测代码中由于不同作用域中同名变量之间的混淆而导致的错误。
TA贡献1801条经验 获得超8个赞
嵌套块将创建一个新的块作用域的词法环境。
内部a变量在该范围内声明,但在初始化之前访问,因此出现错误。
内部作用域let a声明覆盖了var a声明,因此它是一个不同的变量,就好像您这样写:
var a = 6;
{
console.log(a2)
let a2 =55
}
TA贡献1895条经验 获得超7个赞
为了补充上述两个答案,该语句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已经声明但还没有赋值。
添加回答
举报