引发ReferenceError和全局对象引发ReferenceError和全局对象(Referen

2019-05-13 11:39发布

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

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

小提琴

这两条线应该是相同的,难道他们不应该?

Answer 1:

因为window.foo你明确地寻找foo的财产window对象,它是不是在后面的选项的情况。 在后一种选择,如果foo没有定义,你应该为开发者能够知道它是没有定义,并得到明确的错误警告而不是把它翻译设置为undefined自身(如第一种情况),这将导致意想不到的结果。

参考错误 :

当一个不存在的变量被引用表示错误。 试图取消引用尚未声明的变量当A的ReferenceError异常。

看看这篇文章的详细信息:

  • 了解JavaScript的“不确定”

从上面的文章引用:

如果它的基值是未定义的参考被认为是无法解决的。 因此,如果点之前的值是未定义的属性引用是无法解决的。 下面的例子将抛出的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


Answer 2:

在您的第一个例子(window.foo)您正在访问的窗口对象的属性。 JavaScript的返回,当您试图访问一个对象的一个​​不存在的属性“未定义”。 它是这样设计的。

在第二个例子您直接引用的变量,并且由于不存在,它被引发错误。

这只是JavaScript的设计和工作方式。



Answer 3:

在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" 


文章来源: ReferenceError and the global object