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

问题描述 投票:0回答:2

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

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

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

在下面的代码中,

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

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

任何人都可以澄清这些吗?

javascript var let
2个回答
0
投票

实际上是编译器执行LHS和RHS的两个查找。

case 1 : If compiler found the variable then it will hoist the declaration to the top thus you get `undefined`.

case 2 : If compiler didn't find the element itself then 'reference error'. 

假设您使用

console.log(x); var x = 6; //found here

然后吊起:

var x; console.log(x) //this is undefined x = 6


0
投票

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
}
© www.soinside.com 2019 - 2024. All rights reserved.