Mozilla 说变量是全局对象的属性。如果对象具有未定义的属性,则尝试访问它不会创建引用异常 - 它只是返回该属性未定义。
如果存在这样一个全局对象 - 那么为什么访问其不存在的属性(即:变量)会产生引用错误?这两种情况到底有什么区别?
Example:
console.log(x) //x is not declared -> reference error
var x = new Object();
console.log(x.property); //console.log: undefined
tl;dr: The way变量的访问方式才是最重要的,而不是变量的存储方式。
首先是一些背景:
变量“存储”的方式基本上有两种。
In a 陈述性的环境,变量存储在用户代码无法访问的内部数据结构中。
In an object环境,变量存储为用户代码可访问对象的属性。全局环境恰好是一个对象环境(它比这更复杂,但让其保持简单)。因此全局变量是全局对象的属性。
那么为什么访问不存在的全局变量会抛出错误呢?因为它是not变量如何相关stored,仅是如何accessed.
foo
and window.foo
只是访问全局变量的两种不同方式。
评估变量的语言规则 (foo
)明确表示如果变量不存在,则抛出引用错误(同样,无论它如何存储)。*
语言规则用于评估财产访问权(window.foo
)说如果该属性不存在,undefined
应该被退回。
如果你仔细想想,从一致性的角度来看,这更有意义。访问foo
无论变量是存储在声明性环境还是对象环境中,都应该具有相同的结果。
*:更准确地说:这是GetValue导致抛出错误的函数。GetValue
解析变量时几乎在任何地方都会调用(例外情况是typeof
和分组运算符(...)
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)