2008-12-04 102 views
2

Javascript客戶端應用程序。window.unload中的Javascript內存泄漏清理

試圖消除內存泄漏導致醜陋的(至少可以說)代碼。

我想清理在window.unload而不是搞亂所有的代碼,試圖避免它們。

我們主要使用element.onevent=function(){..};模式,導致閉包(主要是想要的)和內存泄漏。

我們不使用JavaScript框架。

關於如何正確清理退出有任何想法?

有沒有人這樣做,或者你想避免它們?

回答

2

最好的解決辦法是爲你鋪開,管理事件處理你自己的方法。因此,在附加事件處理程序時,您的方法可以跟蹤所有添加的事件。在卸載時,它可以取消所有處理程序的註冊。

我知道你說你不使用庫,但你可以使用他們的代碼作爲靈感。當您使用Ext.EventMgr.addListener時,Ext-js會執行此操作。

下面是一個簡單的EvtMgr obj,您可以使用它開始。這很簡單,我不能在這裏爲你寫這些。隨意提問你想要什麼,不知道該怎麼做的問題。另請注意,我不會使用element.onclick方法,因爲您只能添加一個處理程序。我這樣做是因爲你說過你是這麼做的。

var EvtMgr = (function(){ 
    var listenerMap = {}; 

    // Public interface 
    return { 
    addListener: function (evtName, node, handler) { 
     node["on" + evtName] = handler; 
     var eventList = listenerMap[evtName]; 
     if (!eventList) { 
     eventList = listenerMap[evtName] = []; 
     } 
     eventList.push(node); 
    }, 

    removeAllListeners: function() { 
     for (var evtName in listenerMap) { 
     var nodeList = listenerMap[evtName]; 
     for (var i=0, node; node = nodeList[i]; i++) { 
      node["on" + evtName] = null; 
     } 
     } 
    } 
    } 
})(); 

此外,請注意,關閉處理程序不是唯一的方法來創建泄漏。看到我對這個問題的評論Javascript memory leaks after unloading a web page

另外,我不明白爲什麼有些人害怕圖書館。 jquery很小,ext核心也是。如果您在不瞭解js的情況下使用它們,可能會非常危險。但是如果你的js技能是穩定的,你可以通過重用他們的代碼來節省很多工作。每當我需要了解如何完成某些事情時,我每天都會得到ext-js的引擎。這就是我給你這幾行代碼的方式。

另一個想法是,在管理內存泄漏時,要確保在從DOM(node.innerHTML或其他任何方式)中刪除元素時刪除處理程序。如果你這樣做,你應該從你從DOM中刪除的節點中刪除處理程序。有一些工作可以幫助你實現這個目標,但它應該成爲你戰略的一部分。

0

由於JavaScript具有自動內存管理功能,因此我不確定您的清理含義。但無論如何,據我所知,在窗口卸載後,與JS相關的所有內存也被釋放。畢竟 - 在卸載後沒有更多的JS從頁面執行,對吧?

+0

對不起,不! 有兩個GC(javascript和DOM)。獨立工作。 如果你連接javascript和DOM對象(我們一直這樣做)泄漏發生。 – pkario 2008-12-04 09:07:26

0

從我對此的大部分調查來看,沒有好的方法做到這一點..每個瀏覽器都有它自己的垃圾回收實現。

Firefox並沒有那麼糟糕,但是IE6比較糟糕。嘗試創建超過60個對象的任何內容,IE6將變得非常緩慢。

只是其中之一,我已經接受。

1

用於避免事件發生內存泄漏的解決方案是委派。簡而言之,您將事件處理程序附加到父對象而不是子對象。由於傳播,點擊一個孩子也將註冊爲父母的點擊,觸發你的處理程序。通過檢查事件的目標屬性,您可以決定如何處理它。

由於處理程序已連接到父級,因此可以添加或刪除子級而不必擔心泄漏。

更詳盡的解釋可以在這裏找到:http://www.robertnyman.com/2008/05/04/event-delegation-with-javascript/

一個演示在這裏:http://www.robertnyman.com/test/event-delegation/event-delegation.html