在javascript
window
中是全局对象,这意味着全局范围中的每个对象都是window
的子对象。那么为什么我得到这个结果:
console.log(window.foo); // No error, logs "undefined".
console.log(foo); // Uncaught ReferenceError: foo is not defined.
那两行应该是一样的,不应该吗?
答案 0 :(得分:18)
因为使用window.foo
,您明确要查找foo
对象的window
属性,而后一选项则不然。在后一个选项中,如果未定义foo
,您应该知道它没有定义并且得到明确的错误警告,而不是解释器自己将其设置为undefined
(如第一种情况),这将导致意外的结果。
<强> Reference Error 强>
表示引用不存在的变量时的错误。 尝试取消引用尚未声明的变量时抛出ReferenceError。
请查看此文章以获取更多信息:
引用上述文章:
如果参考被定义为无法解析,如果其基值未定义。因此,如果未定义点之前的值,则属性引用是不可解析的。下面的示例将抛出一个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
答案 1 :(得分:2)
在第一个示例(window.foo)中,您正在访问窗口对象的属性。当您尝试访问对象的不存在的属性时,JavaScript返回“undefined”。它是这样设计的。
在第二个示例中,您直接引用变量,因为它不存在,所以会引发错误。
这就是JavaScript的设计和运作方式。
答案 2 :(得分: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"