window.unload中的Javascript内存泄漏清理

时间:2008-12-04 08:49:17

标签: javascript ajax web-applications memory-leaks

Javascript客户端应用程序。

尝试消除内存泄漏导致丑陋(至少可以说)代码。

我试图在window.unload中清理,而不是弄乱所有试图避免它们的代码。

我们主要使用element.onevent=function(){..};模式,导致关闭(主要是想要的)和内存泄漏。

我们不使用javascript框架。

有没有关于如何在退出时正确清理的想法?

有人做过同样的事情还是你想避免它们?

4 个答案:

答案 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会变得非常迟钝。

其中一件事,我已经接受了。