ReferenceError 和全局对象

IT技术 javascript window referenceerror global-object
2021-02-26 20:42:46

在浏览器window中的JavaScript 中是全局对象,这意味着在全局范围内定义的每个变量都是window. 那么为什么我会得到这个结果:

console.log(window.foo); // No error, logs "undefined".
console.log(foo);        // Uncaught ReferenceError: foo is not defined.

小提琴

这两行应该是一样的吧?

3个回答

因为window.foo你正在明确地寻找对象的foo属性,window这在后一个选项中并非如此。在后一个选项中,如果foo未定义,您作为开发人员应该能够知道它未定义并获得明确的错误警告,而不是解释器将其设置为undefined自己(如第一种情况),这将导致意外结果。

参考错误

当引用不存在的变量时表示错误。尝试取消引用尚未声明的变量时会引发 ReferenceError。

看看这篇文章了解更多信息:

引用上面的文章:

如果一个 Reference的基值是 undefined ,则它被认为是不可解析的因此,如果点之前的值未定义,则属性引用是不可解析的。下面的例子会抛出一个 ReferenceError 但它不会因为 TypeError 首先到达那里。这是因为属性的基值受 CheckObjectCoercible(ECMA 5 9.10 通过 11.2.1)的约束,当尝试将 Undefined 类型转换为 Object 时会抛出 TypeError。

例子:

var foo;
foo.bar; //TypeError (base value, foo, is undefined)
bar.baz; //ReferenceError (bar is unersolvable)
undefined.foo; //TypeError (base value is undefined)

既不是属性也不是变量的引用根据定义是不可解析的,并且会抛出一个 ReferenceError,所以:

foo; //ReferenceError

在您的第一个示例 (window.foo) 中,您正在访问 window 对象的一个​​属性。当您尝试访问对象的不存在属性时,JavaScript 会返回“未定义”。它是这样设计的。

在第二个示例中,您直接引用了一个变量,由于它不存在,因此会引发错误。

这就是 JavaScript 的设计和工作方式。

在JavaScript中,你可以像飞分配对象字段,所以window.foo近(见下文评论)等同于var foo; 在全球范围内所定义的时候,而只是打电话foo蓝色的出使得浏览器恐慌“导致它down't甚至不知道哪些反对查看。请注意,如果您这样做:

//when in global context, 'var' sets a property on the window object
var foo;

console.log(foo);
//it will then also log `undefined` instead of throwing the error.

//if you then do:
foo = "abbazabba";

console.log(window.foo);
// it will return "abbazabba" 
@TimDown。你能再详细点吗?也许在答案中?
2021-04-22 20:42:46
我猜你是在控制台中尝试它,这会改变一些事情,因为控制台使用eval()和执行的代码的eval()行为与正常执行的代码略有不同。改为在测试页面中尝试。
2021-04-22 20:42:46
它仍然不完全等效。例如,可以删除已显式设置的全局对象属性(之后window.foo = "bar";delete window.foo;删除foo属性并返回true),而不能删除变量(之后var foo = "bar";delete window.foo;不执行任何操作并返回false)。
2021-04-24 20:42:46
window.foo不等于var foo
2021-04-30 20:42:46
@TimDown & @gdoron 好吧,这有点不真实——我的意思是 window.foo 等同var foo于在全局上下文中声明的时候。
2021-05-09 20:42:46