9

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

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

小提琴

那两条线应该是一样的,不是吗?

4

3 回答 3

19
于 2012-04-11T09:05:06.657 回答
3

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

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

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

于 2012-04-11T09:04:47.080 回答
1

在 JavaScript 中,您可以像这样动态分配对象字段,因此window.foo几乎(参见下面的注释)等同var foo; 于在全局上下文中定义时,而只是foo突然调用会使浏览器恐慌,因为它甚至不知道哪个要查看的对象。请注意,如果您这样做:

//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" 
于 2012-04-11T09:07:05.013 回答