当JavaScript抛出引用错误时,背后的逻辑是什么?

当JavaScript抛出引用错误时,背后的逻辑是什么?,javascript,error-handling,initialization,nullreferenceexception,referenceerror,Javascript,Error Handling,Initialization,Nullreferenceexception,Referenceerror,多年来我一直在使用JavaScript,但最近我一直在努力增加对该语言的深入了解。当JavaScript抛出引用错误时,我对背后的逻辑有点困惑 例如,这些都不会引发引用错误,但仍会将未定义的写入控制台: function foobar(foo) { var bar = foo; console.log(bar); } foobar(); var bar = foo; console.log(bar); 或 或 但这显然会在第一行抛出ReferenceError错误,而不会写入

多年来我一直在使用JavaScript,但最近我一直在努力增加对该语言的深入了解。当JavaScript抛出引用错误时,我对背后的逻辑有点困惑

例如,这些都不会引发引用错误,但仍会将
未定义的
写入控制台:

function foobar(foo)
{
    var bar = foo;
    console.log(bar);
}
foobar();
var bar = foo;
console.log(bar);

但这显然会在第一行抛出ReferenceError错误,而不会写入控制台:

function foobar(foo)
{
    var bar = foo;
    console.log(bar);
}
foobar();
var bar = foo;
console.log(bar);
因此,似乎在参数列表中包含一个变量或声明它将阻止抛出referenceError,即使该变量仍然是“未定义的”


有人知道引擎盖下发生了什么,或者围绕着这件事的硬性规定是什么吗?有人知道为什么这些不被视为引用错误吗?

使用一个存在但具有未定义值的变量和使用一个不存在且从未声明过的变量是有区别的

后者将在您尝试引用不存在且尚未声明的内容时创建引用错误

另一方面,当你这样做的时候

var foo;
foo
确实存在,并且它已经声明,它的值只是
未定义的
,因此您仍然可以引用它而不会抛出错误


换句话说,尝试引用尚未声明的变量将抛出引用错误,而引用已声明的变量将永远不会抛出引用错误,无论是否为该变量设置了值。

使用存在但值未定义的变量是有区别的,使用一个不存在且从未声明过的变量

后者将在您尝试引用不存在且尚未声明的内容时创建引用错误

另一方面,当你这样做的时候

var foo;
foo
确实存在,并且它已经声明,它的值只是
未定义的
,因此您仍然可以引用它而不会抛出错误

换句话说,尝试引用未声明的变量将抛出引用错误,而引用已声明的变量将永远不会抛出引用错误,无论是否为该变量设置了值。

+1 ECMA-262将3改为“变量在创建时初始化为未定义”,它清除了访问代码中已声明但未分配值的变量值的问题。+1 ECMA-262 ed 3,并表示“变量在创建时初始化为未定义”,它清除了访问代码中已声明但未分配值的变量值的问题。