Javascript客户端应用程序。window.unload中的Javascript内存泄漏清理
试图消除内存泄漏导致丑陋的(至少可以说)代码。
我想清理在window.unload而不是搞乱所有的代码,试图避免它们。
我们主要使用element.onevent=function(){..};
模式,导致闭包(主要是想要的)和内存泄漏。
我们不使用JavaScript框架。
关于如何正确清理退出有任何想法?
有没有人这样做,或者你想避免它们?
Javascript客户端应用程序。window.unload中的Javascript内存泄漏清理
试图消除内存泄漏导致丑陋的(至少可以说)代码。
我想清理在window.unload而不是搞乱所有的代码,试图避免它们。
我们主要使用element.onevent=function(){..};
模式,导致闭包(主要是想要的)和内存泄漏。
我们不使用JavaScript框架。
关于如何正确清理退出有任何想法?
有没有人这样做,或者你想避免它们?
最好的解决办法是为你铺开,管理事件处理你自己的方法。因此,在附加事件处理程序时,您的方法可以跟踪所有添加的事件。在卸载时,它可以取消所有处理程序的注册。
我知道你说你不使用库,但你可以使用他们的代码作为灵感。当您使用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中删除的节点中删除处理程序。有一些工作可以帮助你实现这个目标,但它应该成为你战略的一部分。
由于JavaScript具有自动内存管理功能,因此我不确定您的清理含义。但无论如何,据我所知,在窗口卸载后,与JS相关的所有内存也被释放。毕竟 - 在卸载后没有更多的JS从页面执行,对吧?
从我对此的大部分调查来看,没有好的方法做到这一点..每个浏览器都有它自己的垃圾回收实现。
Firefox并没有那么糟糕,但是IE6比较糟糕。尝试创建超过60个对象的任何内容,IE6将变得非常缓慢。
只是其中之一,我已经接受。
用于避免事件发生内存泄漏的解决方案是委派。简而言之,您将事件处理程序附加到父对象而不是子对象。由于传播,点击一个孩子也将注册为父母的点击,触发你的处理程序。通过检查事件的目标属性,您可以决定如何处理它。
由于处理程序已连接到父级,因此可以添加或删除子级而不必担心泄漏。
更详尽的解释可以在这里找到:http://www.robertnyman.com/2008/05/04/event-delegation-with-javascript/
一个演示在这里:http://www.robertnyman.com/test/event-delegation/event-delegation.html
对不起,不! 有两个GC(javascript和DOM)。独立工作。 如果你连接javascript和DOM对象(我们一直这样做)泄漏发生。 – pkario 2008-12-04 09:07:26