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

window.unload中的Javascript内存泄漏清理,javascript,ajax,web-applications,memory-leaks,Javascript,Ajax,Web Applications,Memory Leaks,Javascript客户端应用程序 试图消除内存泄漏会导致难看的(至少可以说)代码 我正试图在window.unload中进行清理,而不是在试图避免它们的情况下弄乱所有代码 我们主要使用element.onevent=function(){..}模式,这会导致关闭(主要需要)和内存泄漏 我们不使用javascript框架 关于如何在出口时进行适当清理,有什么想法吗 有人做过同样的事情吗?或者你正在试图避免他们?我不知道你说的清理是什么意思,因为JavaScript有自动内存管理功能。但无论如何,

Javascript客户端应用程序

试图消除内存泄漏会导致难看的(至少可以说)代码

我正试图在window.unload中进行清理,而不是在试图避免它们的情况下弄乱所有代码

我们主要使用
element.onevent=function(){..}模式,这会导致关闭(主要需要)和内存泄漏

我们不使用javascript框架

关于如何在出口时进行适当清理,有什么想法吗


有人做过同样的事情吗?或者你正在试图避免他们?

我不知道你说的清理是什么意思,因为JavaScript有自动内存管理功能。但无论如何,正如我所理解的,在卸载窗口之后,与JS相关的所有内存也会被释放。毕竟,在页面卸载后,不再有JS从页面执行,对吗?

根据我对这方面的大部分调查,没有好的方法可以做到这一点。。每个浏览器都有自己的垃圾收集实现

Firefox还不错,但IE6就很糟糕。。尝试创建任何超过60个对象,IE6将变得非常缓慢


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

避免事件内存泄漏的解决方案是委派。简而言之,将事件处理程序附加到父对象而不是子对象。由于传播的原因,单击子对象也会注册为单击父对象,从而触发处理程序。通过检查事件的target属性,您可以决定如何处理它

由于处理程序附加到父级,因此可以添加或删除子级,而无需担心泄漏

可以在此处找到更详细的解释:


这里有一个演示:

最好的解决方案是推出自己的方法来管理事件处理。因此,当附加事件处理程序时,您的方法可以跟踪所有添加的事件。卸载时,它可以注销所有处理程序

我知道你说过你不使用库,但你可以用它们的代码作为灵感。当您使用Ext.EventMgr.addListener时,ExtJS会这样做

下面是一个简单的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;
        }
      }
    }
  }
})();
此外,请注意,带有闭包的处理程序不是造成泄漏的唯一方法。见我对这个问题的评论

还有,我不明白为什么有些人害怕图书馆。jquery很小,extcore也很小。如果您在不了解js的情况下使用它们,它们可能会很危险。但是如果你的js技能很好,你可以通过重用他们的代码来节省很多工作。当我需要了解一些事情是如何完成的时候,我每天都在ExtJS的保护之下。这就是我给你这几行代码的方式

管理内存泄漏时要考虑的另一个问题是确保在从DOM中删除元素时删除处理程序(node.innerHTML或任何其他方式)。如果这样做,则应该从已从DOM中删除的节点中删除处理程序。有一些工作要做,但这应该是你战略的一部分。

对不起,没有!有两种GC(javascript和DOM)。独立工作。如果您连接javascript和DOM对象(我们一直都这样做),就会发生泄漏。