在浏览器window
中的 JavaScript 中是全局对象,这意味着在全局范围内定义的每个变量都是window
. 那么为什么我会得到这个结果:
console.log(window.foo); // No error, logs "undefined".
console.log(foo); // Uncaught ReferenceError: foo is not defined.
那两条线应该是一样的,不是吗?
在浏览器window
中的 JavaScript 中是全局对象,这意味着在全局范围内定义的每个变量都是window
. 那么为什么我会得到这个结果:
console.log(window.foo); // No error, logs "undefined".
console.log(foo); // Uncaught ReferenceError: foo is not defined.
那两条线应该是一样的,不是吗?
在您的第一个示例(window.foo)中,您正在访问窗口对象的属性。当您尝试访问对象的不存在属性时,JavaScript 返回“未定义”。它就是这样设计的。
在第二个示例中,您直接引用了一个变量,并且由于它不存在,因此会引发错误。
这就是 JavaScript 的设计和工作方式。
在 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"