ReferenceError和全局对象

时间:2012-04-11 08:59:47

标签: javascript window referenceerror global-object

javascript window中是全局对象,这意味着全局范围中的每个对象都是window的子对象。那么为什么我得到这个结果:

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

Fiddle

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

3 个答案:

答案 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"