javascript循环引用 - 打破循环

时间:2016-12-27 20:24:38

标签: javascript circular-reference

例如,我有这段代码:

var objectA = {};
var objectB = {};

objectA.pointer = objectB;
objectB.pointer = objectA;

objectA = null;
objectB = null;

我假设在最后两个语句之后,没有对最初分配给objectA和objectB变量的对象的引用。但根据技术文献,这些对象的参考仍然存在。为什么?即使objectA和objectB设置为null, objectA.pointer 引用还是 objectB.pointer 引用仍然存在?

2 个答案:

答案 0 :(得分:5)

  

即使objectA.pointerobjectB.pointer设置为objectAobjectB引用还是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的值并没有改变这一点。

答案 1 :(得分:1)

您不必担心这一点,JS是一种托管语言,内置Garbage Collector,可以解决此问题。在此处阅读更多内容:https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

您所描述的内容以各种技术解决。您可以在Java中阅读此问题How does Java Garbage Collection work with Circular References?,了解其实施情况。