2016-12-27 59 views
1

例如,我有这样的代码:JavaScript的循环引用 - 打破周期

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

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

objectA = null; 
objectB = null; 

我认为最后两个语句之后,还有就是原来分配给对象A和对象B变量对象没有提及。但根据技术文献,这些对象的参考依然存在。为什么?是否objectA.pointer引用或objectB.pointer参考连对象A和对象B都设置为null依然存在?

+3

'对象A = NULL;'只设置*变量*'objectA'到'null'值。它不会更改*属性*'objectB.pointer'的值。 'objectB.pointer'仍然指向一个对象。变量/属性只是值的容器。一个赋值“复制”该值,现在两个容器包含“相同”值(每个都有自己的副本)。替换其中一个容器中的值不会奇迹般地替换另一个容器中的值。 –

+0

将'objectA'设置为'null'不会改变'objectB.pointer' – vlaz

+0

@FelixKling:如果objectB设置为null,** objectB.pointer **如何引用对象? –

回答

5

是否objectA.pointer引用或参考objectB.pointer甚至仍然存在objectAobjectB设置为null

是的。

也许有些ASCII艺术帮助。执行

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

后的环境包含两个变量(objectAobjectA)持有两个对象(表示为ref:XXX)引用:

      +--------------+ 
+-------+---------+ +--->| Object#123 | 
|objectA|ref:123 *+--+ +--------------+ 
+-------+---------+      
|objectB|ref:456 *+--+ +--------------+ 
+-------+---------+ +--->| Object#456 | 
          +--------------+ 

属性添加到OBJETS后,

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的值并没有改变这一点。

+0

哦美丽的ascii艺术!谢谢,这很好解释。我现在清楚地明白了这个问题。我失明了:)再次感谢 –