javascript 循环引用 - 打破循环
javascript circular reference - breaking the cycle
例如,我有这个代码:
var objectA = {};
var objectB = {};
objectA.pointer = objectB;
objectB.pointer = objectA;
objectA = null;
objectB = null;
我假设在最后两个语句之后,没有对最初分配给 objectA 和 objectB 变量的对象的引用。但根据技术文献,这些对象的引用仍然存在。为什么 ? objectA.pointer 引用或 objectB.pointer 引用是否仍然存在,即使 objectA 和 objectB 设置为空?
您不必担心这一点,JS
是一种托管语言并且有一个内置的 Garbage Collector
,可以处理这种情况。在这里阅读更多:https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
您所描述的内容已通过各种技术得到解决。您可以在这个问题 How does Java Garbage Collection work with Circular References? 中阅读有关其在 Java
.
中的实现的信息
Does objectA.pointer
reference or objectB.pointer
reference still exists even the objectA
and objectB
are set to null
?
是的。
也许一些 ASCII 艺术有帮助。演出后
var objectA = {};
var objectB = {};
环境包含两个变量(objectA
和 objectA
),它们保存对两个对象(表示为 ref:XXX
)的引用:
+--------------+
+-------+---------+ +--->| Object#123 |
|objectA|ref:123 *+--+ +--------------+
+-------+---------+
|objectB|ref:456 *+--+ +--------------+
+-------+---------+ +--->| Object#456 |
+--------------+
为对象添加属性后,
objectA.pointer = objectB;
objectB.pointer = objectA;
两个对象都有一个 pointer
属性 每个对象都包含对另一个对象的引用:
+-----------------+
| Object#123 |
+--->+-------+---------+<----+
+-------+---------+ | |pointer|ref:456 *+---+ |
|objectA|ref:123 *+-+ +-------+---------+ | |
+-------+---------+ | |
|objectB|ref:456 *+-+ +-----------------+ | |
+-------+---------+ | | Object#456 | | |
+--->+-------+---------+<--+ |
|pointer|ref:123 *+-----+
+-------+---------+
如您所见,pointer
属性 与 objectA
和 objectB
变量之间没有关系。 objectA.pointer
没有引用变量 objectB
,它得到了它的值的副本 (ref:456
),一个对象的引用。
将两个变量设置为 null
后,
objectA = null;
objectB = null;
环境是这样的:
+-----------------+
| Object#123 |
+-------+---------+<----+
+-------+---------+ |pointer|ref:456 *+---+ |
|objectA| null | +-------+---------+ | |
+-------+---------+ | |
|objectB| null | +-----------------+ | |
+-------+---------+ | Object#456 | | |
+-------+---------+<--+ |
|pointer|ref:123 *+-----+
+-------+---------+
pointer
属性仍然持有对其他对象的引用。替换 objectA
和 objectB
的值并没有改变。
例如,我有这个代码:
var objectA = {};
var objectB = {};
objectA.pointer = objectB;
objectB.pointer = objectA;
objectA = null;
objectB = null;
我假设在最后两个语句之后,没有对最初分配给 objectA 和 objectB 变量的对象的引用。但根据技术文献,这些对象的引用仍然存在。为什么 ? objectA.pointer 引用或 objectB.pointer 引用是否仍然存在,即使 objectA 和 objectB 设置为空?
您不必担心这一点,JS
是一种托管语言并且有一个内置的 Garbage Collector
,可以处理这种情况。在这里阅读更多:https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
您所描述的内容已通过各种技术得到解决。您可以在这个问题 How does Java Garbage Collection work with Circular References? 中阅读有关其在 Java
.
Does
objectA.pointer
reference orobjectB.pointer
reference still exists even theobjectA
andobjectB
are set tonull
?
是的。
也许一些 ASCII 艺术有帮助。演出后
var objectA = {};
var objectB = {};
环境包含两个变量(objectA
和 objectA
),它们保存对两个对象(表示为 ref:XXX
)的引用:
+--------------+
+-------+---------+ +--->| Object#123 |
|objectA|ref:123 *+--+ +--------------+
+-------+---------+
|objectB|ref:456 *+--+ +--------------+
+-------+---------+ +--->| Object#456 |
+--------------+
为对象添加属性后,
objectA.pointer = objectB;
objectB.pointer = objectA;
两个对象都有一个 pointer
属性 每个对象都包含对另一个对象的引用:
+-----------------+
| Object#123 |
+--->+-------+---------+<----+
+-------+---------+ | |pointer|ref:456 *+---+ |
|objectA|ref:123 *+-+ +-------+---------+ | |
+-------+---------+ | |
|objectB|ref:456 *+-+ +-----------------+ | |
+-------+---------+ | | Object#456 | | |
+--->+-------+---------+<--+ |
|pointer|ref:123 *+-----+
+-------+---------+
如您所见,pointer
属性 与 objectA
和 objectB
变量之间没有关系。 objectA.pointer
没有引用变量 objectB
,它得到了它的值的副本 (ref:456
),一个对象的引用。
将两个变量设置为 null
后,
objectA = null;
objectB = null;
环境是这样的:
+-----------------+
| Object#123 |
+-------+---------+<----+
+-------+---------+ |pointer|ref:456 *+---+ |
|objectA| null | +-------+---------+ | |
+-------+---------+ | |
|objectB| null | +-----------------+ | |
+-------+---------+ | Object#456 | | |
+-------+---------+<--+ |
|pointer|ref:123 *+-----+
+-------+---------+
pointer
属性仍然持有对其他对象的引用。替换 objectA
和 objectB
的值并没有改变。