在浏览器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
你正在明确地寻找对象的foo
属性,window
这在后一个选项中并非如此。在后一个选项中,如果foo
未定义,您作为开发人员应该能够知道它未定义并获得明确的错误警告,而不是解释器将其设置为undefined
自己(如第一种情况),这将导致意外结果。
参考错误:
当引用不存在的变量时表示错误。尝试取消引用尚未声明的变量时会引发 ReferenceError。
看看这篇文章了解更多信息:
引用上面的文章:
如果一个 Reference的基值是 undefined ,则它被认为是不可解析的。因此,如果点之前的值未定义,则属性引用是不可解析的。下面的例子会抛出一个 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
在您的第一个示例 (window.foo) 中,您正在访问 window 对象的一个属性。当您尝试访问对象的不存在属性时,JavaScript 会返回“未定义”。它是这样设计的。
在第二个示例中,您直接引用了一个变量,由于它不存在,因此会引发错误。
这就是 JavaScript 的设计和工作方式。
在JavaScript中,你可以像飞分配对象字段,所以window.foo
是近(见下文评论)等同于var foo;
在全球范围内所定义的时候,而只是打电话foo
蓝色的出使得浏览器恐慌“导致它down't甚至不知道哪些反对查看。请注意,如果您这样做:
//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"