2016-12-27 66 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藝術!謝謝,這很好解釋。我現在清楚地明白了這個問題。我失明瞭:)再次感謝 –