2010-05-03 18 views

回答

1

嘿,很好的問題。問題在於JavaScript對象和DOM節點之間的循環引用。

假設您有一個全局JavaScript對象,它指向一個DOM節點,並且該節點具有一個expando屬性返回到該對象。當頁面卸載時,腳本引擎會「消除」JavaScript對象,因此它不再指向DOM節點。但是,它不能從內存中釋放對象,因爲仍然有對它的引用(來自DOM)。然後腳本引擎終止。

DOM上的Expando屬性不過是對其他對象的引用。當DOM正在清理時,它會打破這些引用,但假定這些對象仍在使用中。在這個例子中,DOM等待腳本引擎清理屬於它的對象,但腳本引擎已經終止。

所以,問題是,DOM只處理屬於它的內存,並假定腳本引擎將執行相同的操作。

我希望這有助於。

請參閱:http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

+0

謝謝你的乾淨解釋。對我來說還不清楚的是,當頁面卸載時,爲什麼DOM仍然存在。我的意思是,如果在卸載後沒有頁面要談論,爲什麼瀏覽器仍然將該頁面的DOM保留在內存中? – pencilCake 2010-05-07 07:13:05

+0

DOM作爲瀏覽器進程的內存堆中的對象集合而存在。這不像DOM是一個瀏覽器可以拋棄的單一實體。 (例外情況是瀏覽器爲每個選項卡產生一個單獨的進程,在這種情況下,瀏覽器可以通過殺死進程並讓操作系統回收內存來清除所有內容。) 無論如何,當頁面卸載「DOM」已經消失了,但由於循環引用,它可能仍然存在。這並不是瀏覽器想要將它們留在後面,它只是無法清理它們,因爲它認爲仍然有對它們的引用。 – 2010-05-10 19:05:23

+0

我認爲這隻對IE來說是正確的,因爲它的垃圾收集方式(即引用計數而不是標記和掃描),對不對? – 2014-08-22 20:42:36

相關問題