Javascript 为什么这个未分配的let变量不会导致引用错误?

Javascript 为什么这个未分配的let变量不会导致引用错误?,javascript,referenceerror,Javascript,Referenceerror,在这个代码段中,为什么尝试访问bar不会导致引用错误?我读过一些问题/答案,试图解释let和var之间的差异,但似乎没有一个问题/答案能够解释顶部和底部示例的行为差异 var-foo; 让吧; if(foo)(=>{};//我希望这一切都会好起来 if(bar)(=>{};//我以为这会引发一个引用错误 console.log('finished')让绑定在包含声明的(块)范围的顶部创建,通常称为“提升”。与使用var声明的变量不同,它将以未定义的值开始,让变量在计算其定义之前不初始化。在初始

在这个代码段中,为什么尝试访问
bar
不会导致引用错误?我读过一些问题/答案,试图解释
let
var
之间的差异,但似乎没有一个问题/答案能够解释顶部和底部示例的行为差异

var-foo;
让吧;
if(foo)(=>{};//我希望这一切都会好起来
if(bar)(=>{};//我以为这会引发一个引用错误

console.log('finished')让绑定在包含声明的(块)范围的顶部创建,通常称为“提升”。与使用var声明的变量不同,它将以未定义的值开始,让变量在计算其定义之前不初始化。在初始化之前访问变量会导致ReferenceError。从块的开始到初始化处理,变量处于“时间死区”


更多信息:

让绑定创建在包含声明的(块)范围的顶部,通常称为“提升”。与使用var声明的变量不同,它将以未定义的值开始,让变量在计算其定义之前不初始化。在初始化之前访问变量会导致ReferenceError。从块的开始到初始化处理,变量处于“时间死区”


更多信息:

未分配并不意味着未初始化。
let条语句的作用与
let bar=undefined相同-除非在变量声明中提供显式初始化器(“右侧”),否则它将以
未定义的
作为默认值进行初始化

当您在初始化之前访问使用
let
声明的变量时,当对其声明语句求值时,将抛出引用错误:

let bar; // = undefined;

if (bar) {} // this is fine

console.log('finished');


有关更多详细信息,请参阅关于暂时死区。

未分配并不意味着未初始化。
let条语句的作用与
let bar=undefined相同-除非在变量声明中提供显式初始化器(“右侧”),否则它将以
未定义的
作为默认值进行初始化

当您在初始化之前访问使用
let
声明的变量时,当对其声明语句求值时,将抛出引用错误:

let bar; // = undefined;

if (bar) {} // this is fine

console.log('finished');


有关更多详细信息,请参阅关于时间死区。

不读取任何文本就可能复制:未初始化的变量初始化为
未定义的
。换句话说,
让x=未定义
设x是相同的(不包括畸形病例)@ASDFGerte似乎我遇到了某种畸形病例。在我下面的例子中,有没有什么东西可能指向这些怪胎的方向?底部是添加
x=undefined
而不是仅仅声明x解决了一个引用错误问题,顶部问题的示例是我编写的一个片段,显示了原始问题是什么,并且没有基于问题解决方案的预期行为。我想的案例并不是偶然发生的,我不知道有什么能立即解释你的行为。我猜你的列表中有一个分号:
let value1=3;myValue。另外,代码将处于非严格模式,并且您无意中对一个全局变量进行了操作。@ASDFGerte我也在寻找它。我看到的唯一一个可能很奇怪的是一个分配给布尔表达式结果的变量,因此我在布尔表达式周围添加了一些括号,以确保我没有操作顺序问题,但没有看到任何区别。但是,如果是这种情况,变量不会抛出引用错误吗,因为它现在将是一个全局变量而不是let,并且默认为未定义?在不读取任何文本的情况下,可能会重复:未初始化的变量初始化为
未定义的
。换句话说,
让x=未定义
设x是相同的(不包括畸形病例)@ASDFGerte似乎我遇到了某种畸形病例。在我下面的例子中,有没有什么东西可能指向这些怪胎的方向?底部是添加
x=undefined
而不是仅仅声明x解决了一个引用错误问题,顶部问题的示例是我编写的一个片段,显示了原始问题是什么,并且没有基于问题解决方案的预期行为。我想的案例并不是偶然发生的,我不知道有什么能立即解释你的行为。我猜你的列表中有一个分号:
let value1=3;myValue。另外,代码将处于非严格模式,并且您无意中对一个全局变量进行了操作。@ASDFGerte我也在寻找它。我看到的唯一一个可能很奇怪的是一个分配给布尔表达式结果的变量,因此我在布尔表达式周围添加了一些括号,以确保我没有操作顺序问题,但没有看到任何区别。然而,如果是这样的话,这个变量会不会抛出一个引用错误,因为它现在是一个全局变量而不是let,默认为undefined?不过,这不是我所经历的。我预期会出现引用错误,但没有得到。我原以为这是我遇到的问题的原因,但当我编写这个快速片段来测试/显示这是原因时,它毫无错误地工作了。哦,现在我明白了。您的案例似乎有点奇怪,我猜代码的其余部分还存在其他问题。实际上,这里的问题是,在声明单个变量或逗号分隔的变量列表时,行为是否有所不同。你是对的,我发现了一个错误