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

时间:2017-07-22 21:18:09

标签: javascript object properties circular-reference

这个问题来自一个练习,它促使我创建一个圆形对象,以伪代码形式

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的原因,而后者的行为与我预期的一样?

1 个答案:

答案 0 :(得分:2)

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

{ ... }创建一个新对象并作为对它的引用进行评估。

circular = { ... }接受该引用并将其分配给circular

在评估了对象文字语法之后,才会进行赋值。

如果您尝试在对象文字语法中读取circular的值,它将为undefined,因为您在分配发生之前

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