如何正确解绑jQuery小部件中的dom元素?

时间:2010-09-25 16:57:41

标签: jquery memory-leaks unbind

我在JavaScript中遇到了一些内存泄漏问题。

我正在使用Leak Memory 0.4.5 extension for Firefox向我展示那些仍留在内存中的JavaScript对象。

现在我不确定如何从事件等中正确解开dom-object。

例如,我有一个名为'dropdownbox'的jQuery小部件。 在destroy方法中,我将所有必要的东西解除绑定事件处理程序,如:

this.box.find('.toggler').unbind();
this.box.remove();
this.box = null;

这三行是​​必须的,还是只能调用this.box.remove()?

到今天为止,我从未对DOM元素进行过绑定或清除,因为我认为这无关紧要。但是我提出了这个问题,在同一个网站上开发了2个小时之后,我的Firefox消耗了1GB!

所以当我使用闭合装置等时,我会读到一些内存泄漏。
所以这是我的第二个问题:我经常使用封口,因为它们非常酷且方便 有人说你不应该使用封闭装置。例如,如果我们有以下代码:

function foo(param1, param2) {
  var local1, local2;
  $('a').click(function() {
    alert('YEAH');
  });
}

最好这样做:

funtion foo(param1, param2) {
      var local1, local2;
      $('a').click(clickEvent);
    }
function() {
  alert('YEAH');
}

或者我误解了吗?

2 个答案:

答案 0 :(得分:3)

我知道这是一个古老的话题,但你提到了闭包,但你提供的例子并不是闭包。当函数返回内部函数时,闭包“发生”。人们可能会看到这里,因为这个问题是谷歌搜索结果“javascript内存泄漏unbind事件”,他们不应该给出错误的信息:)我知道这不是故意的。

请在此处查看优秀的闭包说明:How do JavaScript closures work?

答案 1 :(得分:1)

您可以致电:

this.box.remove();
this.box = null;

.remove()也将remove any child elements and their event handlers/data as well。取消.box对元素的引用是完全删除的最后一步(假设没有 else 它挂在它上面)。

对于你的另一个例子,第二个版本的效率更高一些,因为处理程序没有被复制到整个地方,处理程序越大它就越有效。