这个问题源于一个练习,它促使我创建一个循环对象,以便在伪代码中,
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
。然后,可以修改该对象以添加其值为该引用的新属性。