说let声明被悬挂但未初始化是什么意思?

时间:2019-11-10 06:47:33

标签: javascript var let

我知道下面的代码段会导致ReferenceError:

console.log(b);
let b = 3;

我已经读到,如果我们使用var而不是let,它不会失败。
MDN documentations,声称也让let声明也被悬挂,但是它们没有初始化
令我感到困惑的是初始化,当我们谈论ReferenceError时,它甚至有什么关系。

在下面的代码中,

let b;
console.log(b);
b = 3;

初始化是在console.log(b)之后编写的,但这不会产生任何ReferenceError,因此在第一个代码段中抛出异常是没有道理的,因为该变量未初始化。

任何人都可以澄清一下这些事情吗?

1 个答案:

答案 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
}