我知道下面的代码段会导致ReferenceError:
console.log(b);
let b = 3;
我已经读到,如果我们使用var
而不是let
,它不会失败。
MDN documentations,声称也让let声明也被悬挂,但是它们没有初始化
令我感到困惑的是初始化,当我们谈论ReferenceError时,它甚至有什么关系。
在下面的代码中,
let b;
console.log(b);
b = 3;
初始化是在console.log(b)
之后编写的,但这不会产生任何ReferenceError,因此在第一个代码段中抛出异常是没有道理的,因为该变量未初始化。
任何人都可以澄清一下这些事情吗?
答案 0 :(得分:1)
如果在之前 已初始化访问,则
let
(和const
)声明将引发错误。
这是什么意思?
如果在程序到达声明行之前尝试访问变量,则会收到错误消息:
try{
console.log(b)
}catch(e){
console.error(e) //ReferenceError
}
let b //b initalized here (b===undefined)
console.log(b) //undefined
b=3 //Reassign b with 3
console.log(b) //3
即使let
缺少=value
部分(在这种情况下,其值为undefined
)也会发生初始化,因此不会再引发错误。
这就是为什么您不能从=value
声明中省略const
部分的原因:它将以undefined
开头,以后将无法重新分配。
还要注意,这种错误与尝试访问 undefined 变量时的错误不同:即使定义了变量,前者也会被抛出(在另一个变量中范围):
let b=1
console.log(b) //1
{
//Different scope
try{
console.log(b)
}catch(e){
console.error(e) //ReferenceError: the inner b shadows the outer, but not yet initialized
}
let b=2
console.log(b) //2
}