在javascript
window
是全局对象,这意味着在全球范围内的每个对象的子window
。 那么,为什么我得到这样的结果:
console.log(window.foo); // No error, logs "undefined".
console.log(foo); // Uncaught ReferenceError: foo is not defined.
小提琴
这两条线应该是相同的,难道他们不应该?
在javascript
window
是全局对象,这意味着在全球范围内的每个对象的子window
。 那么,为什么我得到这样的结果:
console.log(window.foo); // No error, logs "undefined".
console.log(foo); // Uncaught ReferenceError: foo is not defined.
小提琴
这两条线应该是相同的,难道他们不应该?
因为window.foo
你明确地寻找foo
的财产window
对象,它是不是在后面的选项的情况。 在后一种选择,如果foo
没有定义,你应该为开发者能够知道它是没有定义,并得到明确的错误警告而不是把它翻译设置为undefined
自身(如第一种情况),这将导致意想不到的结果。
参考错误 :
当一个不存在的变量被引用表示错误。 试图取消引用尚未声明的变量当A的ReferenceError异常。
看看这篇文章的详细信息:
从上面的文章引用:
如果它的基值是未定义的参考被认为是无法解决的。 因此,如果点之前的值是未定义的属性引用是无法解决的。 下面的例子将抛出的ReferenceError但事实并非如此,因为类型错误抢先一步。 这是因为一个属性的基值是受CheckObjectCoercible(经由11.2.1 ECMA 5 9.10)试图未定义类型转换为一个对象时引发一个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)您正在访问的窗口对象的属性。 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"