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 = {};

环境包含两个变量(objectAobjectA),它们保存对两个对象(表示为 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 属性 与 objectAobjectB 变量之间没有关系。 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 属性仍然持有对其他对象的引用。替换 objectAobjectB 的值并没有改变。