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

标签 javascript undefined referenceerror

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 中,变量存储为用户代码可访问对象的属性。全局环境恰好是一个对象环境(它比这复杂一点,但让我们保持简单)。因此全局变量是全局对象的属性。


那么为什么访问一个不存在的全局变量会抛出错误呢?因为变量如何存储相关,只有如何访问

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

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

The language rules用于评估属性访问 (window.foo) 表示如果属性不存在,则应返回 undefined

如果您考虑一下,从一致性的 Angular 来看,这更有意义。访问 foo 应该有相同的结果,无论变量是存储在声明环境还是对象环境中。


*:更准确地说:它是 GetValue导致抛出错误的函数。 GetValue 在解析变量时几乎无处不在(异常(exception)是 typeof 和分组运算符 (...))。

关于javascript - 为什么引用未声明的变量会引发引用异常,而引用未声明的属性却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47066042/

相关文章:

javascript - TypeScript 装饰器和循环依赖

javascript - Angular4 - 在 JavaScript 文件中使用函数

javascript - iframe 中 Bing map 中的多个位置

javascript - 为什么我的 mocha/chai Error throw 测试失败了?

javascript - 为什么 React 的 useCallback 没有使用 ref 进行优化?

javascript - 使用ajax时如何解决未定义索引?

javascript - 如何在 jQuery 中解析字符串

javascript - 从二维数组中检索随机值

javascript - 如何解决 TypeError : Cannot convert undefined or null to object

go - 为什么未定义: error thrown while passing custom struct as pointers?