Javascript客户端应用程序。
尝试消除内存泄漏导致丑陋(至少可以说)代码。
我试图在window.unload中清理,而不是弄乱所有试图避免它们的代码。
我们主要使用element.onevent=function(){..};
模式,导致关闭(主要是想要的)和内存泄漏。
我们不使用javascript框架。
有没有关于如何在退出时正确清理的想法?
有人做过同样的事情还是你想避免它们?
答案 0 :(得分: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中删除的节点中删除处理程序。有一些工作要做到这一点,但它应该是你的战略的一部分。
答案 1 :(得分:1)
避免事件内存泄漏的解决方案是委派。简而言之,您将事件处理程序附加到父对象而不是子对象。由于传播,点击一个孩子也会注册为对父母的点击,从而触发你的处理程序。通过检查事件的目标属性,您可以决定如何处理它。
由于处理程序已附加到父级,因此您可以添加或删除子级而无需担心泄漏。
可以在此处找到更全面的解释:http://www.robertnyman.com/2008/05/04/event-delegation-with-javascript/
此处的演示:http://www.robertnyman.com/test/event-delegation/event-delegation.html
答案 2 :(得分:0)
由于JavaScript具有自动内存管理功能,因此我不确定清理的含义。但无论如何,据我所知,在卸载窗口后,所有与JS相关的内存也会被释放。毕竟 - 在卸载后没有更多的JS从页面执行,对吗?
答案 3 :(得分:0)
从我对此的大多数调查来看,没有好办法这样做..每个浏览器都有自己的垃圾收集实现。
Firefox并不是那么糟糕,但IE6比较糟糕。尝试创建60多个对象,IE6会变得非常迟钝。
其中一件事,我已经接受了。