JavaScript 中的循环对象引用是如何工作的?

How does a circular object reference work in JavaScript?

这个问题源于一个练习,该练习促使我创建一个圆形对象,这样,在伪代码中,

circular.value === "Hello World"
circular === circular.self
circular.self === circular.self.self

...等等。

我注意到如果我像这样构造一个对象字面量,

var circular= {
  value: 'Hello World',
  self: circular
}

那么circular.self就是undefined。但是,如果我构建一个空对象,然后将值分配给这样的属性,

var circular = {};
circular.value = 'Hello World',
circular.self = circular;

那么circular.self(或circular.self.self.self.self.self)就是{ value: 'Hello World', self: [Circular] }。无论我在这些示例中将 属性 命名为 self,都是如此。

所以我的具体问题是,是什么导致前一个示例中的 circular.self 变为 undefined,而后一个示例中的行为却符合我的预期?

var circular 是(因为它使用 var 关键字)提升并在创建范围时在当前范围内声明一个变量(即当输入函数或全局范围时)。它以 undefined

的值开始

{ ... } 创建一个新对象并作为对它的引用求值。

circular = { ... } 获取该引用并将其分配给 circular.

赋值直到对象文字语法被评估后

如果您尝试在对象字面量语法中读取 circular 的值,它将是 undefined 因为您在 赋值发生之前这样做 .


在第二个示例中,在您尝试读取 circular 的值之前,对象存在并且引用已分配给 circular。然后可以修改该对象以添加一个新的 属性,其值为该引用。