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



这个问题源于一个练习,它促使我创建一个循环对象,以便在伪代码中,

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

。等等。

我注意到,如果我构造一个这样的对象文字,

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

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

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。然后,可以修改该对象以添加其值为该引用的新属性。

最新更新