Javascript 客户端应用程序。
试图消除内存泄漏会导致丑陋的(至少可以说)代码。
我试图在 window.unload 中进行清理,而不是弄乱所有试图避免它们的代码。
我们主要使用element.onevent=function(){..};
模式,这会导致关闭(主要是想要的)和内存泄漏。
我们不使用 javascript 框架。
关于如何在退出时正确清理有什么想法吗?
有没有人做同样的事情,或者你想避免他们?
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 内存泄漏
另外,我不明白为什么有些人害怕图书馆。jquery 很小,ext core 也是。如果您在不了解 js 的情况下使用它们,它们可能会很危险。但是如果你的 js 技能扎实,你可以通过重用他们的代码来节省很多工作。当我需要了解某事是如何完成的时,我每天都在使用 ext-js。这就是我给你这几行代码的方式。
管理内存泄漏时要考虑的另一个想法是确保在从 DOM 中删除元素时删除处理程序(node.innerHTML 或任何其他方式)。如果你这样做,你应该从你从 DOM 中删除的节点中删除处理程序。有一些工作可以让它发挥作用,但它应该成为你战略的一部分。
避免事件内存泄漏的一种解决方案是委托。简而言之,您将事件处理程序附加到父对象而不是子对象。由于传播,对子项的单击也将注册为对父项的单击,从而触发您的处理程序。通过检查事件的目标属性,您可以决定如何处理它。
由于处理程序附加到父级,因此您可以添加或删除子级而不必担心泄漏。
更详尽的解释可以在这里找到:http ://www.robertnyman.com/2008/05/04/event-delegation-with-javascript/
这里有一个演示:http ://www.robertnyman.com/test/event-delegation/event-delegation.html
我不确定您对清理的含义是什么,因为 JavaScript 具有自动内存管理功能。但无论如何,据我了解,在卸载窗口后,与 JS 相关的所有内存也会被释放。毕竟 - 页面卸载后不再执行 JS,对吗?
从我对此的大部分调查来看,没有好的方法可以做到这一点。每个浏览器都有自己的垃圾收集实现。
Firefox 还不错,但 IE6 就很糟糕了。尝试创建超过 60 个对象的任何东西,IE6 会变得非常缓慢。
只是其中一件事,我已经接受了。