为什么引用未声明的变量会引发引用异常,但引用未声明的属性却不会?

时间:2017-11-02 01:11:04

标签: javascript undefined referenceerror

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
}

1 个答案:

答案 0 :(得分:4)

tl; dr:访问变量的方式会产生重大影响,而不是如何存储。

首先是一些背景:

变量“存储”的方式基本上有两种。

declarative environment中,变量存储在无法从用户代码访问的内部数据结构中。

object environment中,变量存储为用户代码可访问对象的属性。全局环境恰好是一个对象环境(它比这复杂一点,但让它保持简单)。因此,全局变量是全局对象的属性。

那么为什么访问不存在的全局变量会引发错误?因为变量存储相关,只有访问的方式。

foowindow.foo只是访问全局变量的两种不同方式。

评估变量(foo)的语言规则明确指出,如果变量不存在,则抛出一个引用错误(无论如何存储它)。*

用于评估属性访问权限的{p> The language ruleswindow.foo)表示如果该属性不存在,则应返回undefined

如果你想一想,从一致性的角度来看,这更有意义。无论变量是存储在声明性环境还是对象环境中,访问foo都应该具有相同的结果。

*:更精确:它是导致错误抛出的GetValue函数。解析变量时几乎到处都会调用GetValue(例外是typeof和分组运算符(...))。