在一篇文章中,我已經看到,清除window.unload事件中的所有expandos以防止內存泄漏可能不錯。我必須清理window.onunload事件上的自定義屬性(Expandos)嗎?
我不明白爲什麼要這樣做。
無論如何,瀏覽器在您離開網頁後是否清除了所有DOM及其相關資源?
感謝,
布拉克ozdogan
在一篇文章中,我已經看到,清除window.unload事件中的所有expandos以防止內存泄漏可能不錯。我必須清理window.onunload事件上的自定義屬性(Expandos)嗎?
我不明白爲什麼要這樣做。
無論如何,瀏覽器在您離開網頁後是否清除了所有DOM及其相關資源?
感謝,
布拉克ozdogan
嘿,很好的問題。問題在於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
謝謝你的乾淨解釋。對我來說還不清楚的是,當頁面卸載時,爲什麼DOM仍然存在。我的意思是,如果在卸載後沒有頁面要談論,爲什麼瀏覽器仍然將該頁面的DOM保留在內存中? – pencilCake 2010-05-07 07:13:05
DOM作爲瀏覽器進程的內存堆中的對象集合而存在。這不像DOM是一個瀏覽器可以拋棄的單一實體。 (例外情況是瀏覽器爲每個選項卡產生一個單獨的進程,在這種情況下,瀏覽器可以通過殺死進程並讓操作系統回收內存來清除所有內容。) 無論如何,當頁面卸載「DOM」已經消失了,但由於循環引用,它可能仍然存在。這並不是瀏覽器想要將它們留在後面,它只是無法清理它們,因爲它認爲仍然有對它們的引用。 – 2010-05-10 19:05:23
我認爲這隻對IE來說是正確的,因爲它的垃圾收集方式(即引用計數而不是標記和掃描),對不對? – 2014-08-22 20:42:36