1

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

我正在使用Firefox 的 Leak Memory 0.4.5 扩展,它向我展示了仍然保留在内存中的那些 JavaScript 对象。

现在我不确定如何正确地将 dom-object 与事件等解除绑定。

例如,我有一个名为“dropdownbox”的 jQuery 小部件。在destroy方法中,我做了所有必要的东西来取消绑定事件处理程序,比如:

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

这 3 行是必须的,还是只能调用 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');
}

还是我误解了?

4

2 回答 2

3

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

请在此处查看出色的闭包解释:JavaScript 闭包如何工作?

于 2013-03-09T21:12:04.110 回答
1

你可以打电话:

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

.remove()还将删除任何子元素及其事件处理程序/数据。取消对元素的引用.box是完全删除的最后一步(假设没有其他任何东西挂在上面)。

对于您的另一个示例,第二个版本效率更高,因为处理程序没有被复制到所有地方,处理程序越大,它的作用就越大。

于 2010-09-25T17:01:30.650 回答