我在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');
}
或者我误解了吗?
答案 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 它挂在它上面)。
对于你的另一个例子,第二个版本的效率更高一些,因为处理程序没有被复制到整个地方,处理程序越大它就越有效。