2011-08-16 144 views
11

下面這段代碼是否會造成內存泄漏。jQuery.data會導致內存泄漏嗎?

據jQuery的文檔使用data功能避免了內存泄漏。確認以下內容是否安全將是有用的。

var MyClass = function(el) { 
    // Store reference of element in object. 
    this.element = $(el); 
}; 

// Store reference of object in element. 
$('#something').data('obj', new MyClass('#something')); 
+0

爲什麼你不保存全局js對象的引用? –

+0

@ant_Ti我想要雙向訪問。例如,在一個事件處理程序中,我想訪問'obj',但我也想從'obj'中訪問該元素。 –

+0

我編輯了這個問題以刪除提及的循環引用,因爲這個例子不包含循環引用。 (雖然看起來可能) – mikerobi

回答

7

顯然的代碼,因爲它主張只要DOM元素仍然連接到DOM會佔用更多的內存。但我猜你在問DOM元素不再使用後是否會繼續使用額外的內存。

更新:感謝Joey的答案(這是他自刪除),我花了一些時間在memory leaks in javascript讀書了,它出現在我的下一段的假設是不正確的。因爲DOM元素不使用純垃圾收集,所以像這樣的循環引用通常會阻止DOM元素和javascript對象被釋放。但是,我相信這個答案的其餘部分仍然是正確的。

沒有的JavaScript引擎如何實現垃圾收集有深入的瞭解,我不能權威作主題演講。但是,我對垃圾收集的一般理解使我認爲,從DOM中刪除 #something元素後,您的代碼將是「安全」的,因此生成的 MyClass對象只會引用一個沒有其他連接的對象。垃圾回收器的圖形算法應該能夠識別DOM元素及其對象「浮在空中」並且與其他任何東西都不相關。

此外,jQuery一旦從DOM中移除數據和與給定DOM元素關聯的事件,就會消失。從documentation

jQuery的確保當DOM元件經由jQuery方法除去數據被去除,並且當用戶離開網頁。

因此,假如你使用jQuery一致,一旦對象從DOM無論如何,這使得它 更加容易 可能的垃圾收集知道它可以得到去除,你只會有一個單向參考擺脫這些物體。

所以只要你沒有的東西,一旦DOM元素被刪除別人引用MyClass對象,你不應該有內存泄漏。

+0

謝謝,真的有幫助 –

-4

data屬性只存儲字符串值。

+2

在jQuery中,它可以是任何Javascript類型,包括Array或Object。 –

+0

@ant_Ti - 它在文檔中說什麼? – Neal

+0

[.data()](http://api.jquery.com/data/)描述說**值**新數據值;它可以是任何包含Array或Object的Javascript類型。 –

0

我想這取決於Javascritp引擎。

你有問題恰恰足夠多的進行測試。我在對象中添加了一個長字符串,並在大循環中運行了潛在的泄漏。

因此,我不認爲在IE8和Chrome的泄漏。

但我無法重現these leakeage patterns無論是。

0

這可能導致內存泄漏。 jQuery.data方法的理論可能會使用A Data內部類緩存dom元素的數據。

當然,當您刪除緩存數據時,jQuery將不會引用數據。 但內部緩存是一個增加數組,當你你它,它會繼續。

所以,最後會有很大的緩存數組,這會導致memeory泄漏。 在長期的網絡應用程序中,這可能會泄漏內存崩潰。