ReferenceError和全局对象

gdo*_*ica 6 javascript window referenceerror global-object

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

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

小提琴

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

Sar*_*raz 18

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

参考错误:

表示引用不存在的变量时的错误.尝试取消引用尚未声明的变量时抛出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)
Run Code Online (Sandbox Code Playgroud)

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

foo; //ReferenceError
Run Code Online (Sandbox Code Playgroud)