Mozilla says that variables are properties of the global object .如果对象具有未定义的属性,则尝试访问它不会产生引用异常——它只是返回该属性未定义。
如果有这样一个全局对象——那么为什么访问它不存在的属性(即:变量)会产生引用错误?这两种情况到底有什么区别?
例子:
console.log(x) //x is not declared -> reference error
var x = new Object();
console.log(x.property); //console.log: undefined
最佳答案
tl;dr:访问变量的方式造成了所有差异,而不是它的存储方式。
首先是一些背景:
变量“存储”的方式基本上有两种。
在 declarative environment 中,变量存储在用户代码无法访问的内部数据结构中。
在 object environment 中,变量存储为用户代码可访问对象的属性。全局环境恰好是一个对象环境(它比这复杂一点,但让我们保持简单)。因此全局变量是全局对象的属性。
那么为什么访问一个不存在的全局变量会抛出错误呢?因为变量如何存储不相关,只有如何访问。
foo
和 window.foo
只是访问全局变量的两种不同方式。
评估变量 (foo
) 的语言规则明确指出,如果变量不存在,则抛出引用错误(同样,无论它是如何存储的)。*
The language rules用于评估属性访问 (window.foo
) 表示如果属性不存在,则应返回 undefined
。
如果您考虑一下,从一致性的 Angular 来看,这更有意义。访问 foo
应该有相同的结果,无论变量是存储在声明环境还是对象环境中。
*:更准确地说:它是 GetValue
导致抛出错误的函数。 GetValue
在解析变量时几乎无处不在(异常(exception)是 typeof
和分组运算符 (...)
)。
关于javascript - 为什么引用未声明的变量会引发引用异常,而引用未声明的属性却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47066042/