Mozilla says that variables are properties of the global object。如果对象具有未定义的属性,则尝试访问它不会创建引用异常 - 它只返回未定义属性的情况。
如果存在这样的全局对象 - 那么为什么访问不存在的属性(即:变量)会产生引用错误?这两种情景之间究竟有什么区别?
示例:
public void flip(Node head, Node tail){
Node temp = head;
head = temp.next;
head.next = null;
tail.next = head
}
答案 0 :(得分:4)
tl; dr:访问变量的方式会产生重大影响,而不是如何存储。
首先是一些背景:
变量“存储”的方式基本上有两种。
在declarative environment中,变量存储在无法从用户代码访问的内部数据结构中。
在object environment中,变量存储为用户代码可访问对象的属性。全局环境恰好是一个对象环境(它比这复杂一点,但让它保持简单)。因此,全局变量是全局对象的属性。
那么为什么访问不存在的全局变量会引发错误?因为变量存储的不相关,只有访问的方式。
foo
和window.foo
只是访问全局变量的两种不同方式。
评估变量(foo
)的语言规则明确指出,如果变量不存在,则抛出一个引用错误(无论如何存储它)。*
window.foo
)表示如果该属性不存在,则应返回undefined
。
如果你想一想,从一致性的角度来看,这更有意义。无论变量是存储在声明性环境还是对象环境中,访问foo
都应该具有相同的结果。
*:更精确:它是导致错误抛出的GetValue
函数。解析变量时几乎到处都会调用GetValue
(例外是typeof
和分组运算符(...)
)。