这个问题来自一个练习,它促使我创建一个圆形对象,以伪代码形式
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
的原因,而后者的行为与我预期的一样?
答案 0 :(得分:2)
var circular
是(因为它使用var
关键字)并且在创建范围时(即输入函数或全局范围时)在当前范围内声明变量。它的值为undefined
{ ... }
创建一个新对象并作为对它的引用进行评估。
circular = { ... }
接受该引用并将其分配给circular
。
在评估了对象文字语法之后,才会进行赋值。
如果您尝试在对象文字语法中读取 在第二个示例中,在您尝试读取circular
的值,它将为undefined
,因为您在分配发生之前 。circular
的值之前,对象已存在且引用已分配给circular
。然后可以修改该对象以添加其值为该引用的新属性。