我知道以下代码段会导致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,因此说在第一个摘要中抛出异常是没有道理的,因为该变量未初始化。
任何人都可以澄清这些吗?
实际上是编译器执行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
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
}