Javascript 什么意思是让声明被挂起而不是初始化?

Javascript 什么意思是让声明被挂起而不是初始化?,javascript,var,let,Javascript,Var,Let,我知道下面的代码片段会导致ReferenceError: console.log(b); let b = 3; 我已经读到,如果我们使用var而不是let, ,声称let声明也被提升,但它们未初始化 让我困惑的是,初始化,当我们谈论引用错误时,它又有什么关系呢 在下面的代码中 let b; console.log(b); b = 3; 初始化是在console.log(b)之后写入的,但这不会产生任何引用错误,因此说在第一个代码段中抛出异常是没有意义的,因为变量没有初始化 谁能澄清一下这些事

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

console.log(b);
let b = 3;
我已经读到,如果我们使用
var
而不是
let

,声称let声明也被提升,但它们未初始化 让我困惑的是,初始化,当我们谈论引用错误时,它又有什么关系呢

在下面的代码中

let b;
console.log(b);
b = 3;
初始化是在
console.log(b)
之后写入的,但这不会产生任何引用错误,因此说在第一个代码段中抛出异常是没有意义的,因为变量没有初始化

谁能澄清一下这些事情吗

如果在初始化之前访问
let
(和
const
)声明,将抛出错误

这是什么意思?

如果在程序到达声明行之前尝试访问变量,将出现错误:

试试看{
控制台日志(b)
}捕获(e){
console.error(e)//ReferenceError
}
让b//b在这里初始化(b==未定义)
console.log(b)//未定义
b=3//用3重新分配b
console.log(b)//3
即使
let
缺少
=value
部分,初始化也会发生,在这种情况下,值
未定义,因此它不会再抛出错误

这就是为什么不能从
const
声明中省略
=value
部分的原因:它将使用
未定义的
初始化,以后无法重新分配

还请注意这种错误与尝试访问未定义变量时的错误不同:即使变量已定义(在另一个范围内),也会引发前者:

设b=1
console.log(b)//1
{
//不同范围
试一试{
控制台日志(b)
}捕获(e){
console.error(e)//ReferenceError:内部b与外部b形成阴影,但尚未初始化
}
设b=2
console.log(b)//2
}

不要挂起声明-哦,等等,它们是(根据该链接)。。。但不是以同样的方式。。。它们位于范围块顶部和声明实际所在位置之间的时间死区中。。。要阻止您执行第一个示例中的操作:轻拍
let b所在的行是,它将被初始化。如果它的右边没有
=
未定义的
将被分配给它-访问
未定义的
不会抛出,访问尚未初始化的变量是完全不同的事情,并且会抛出