2008-12-04 99 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