Javascript匿名函数

时间:2011-02-02 20:49:44

标签: javascript jquery

我有以下代码:

for (var i=0; i < 20; i++) {
    var itemButton = $('<button />').click(function(){ alert('Hello'); }).append('Hello');
    $('#container').append(itemButton);                            
}

我创建了许多按钮,每个按钮都有一个onclick功能。然后我使用$('#shopSearchTopBar').empty();清除#container并再次创建按钮。

我的问题是:这可能是内存泄漏吗?当我在#container上调用.empty()方法或内存被释放时,Javascript是否释放了我第一次创建的匿名函数所使用的内存,我可以安全地添加这20个新按钮,每个按钮都有自己的新匿名函数吗?

2 个答案:

答案 0 :(得分:4)

这些功能存储在jQuery.cache

只要您使用.empty()之类的jQuery方法,就会清除所有受影响元素的数据。

如果你做了这样的事情:

document.getElementById('container').innerHTML = '';

然后你可能会有一个相当讨厌的内存泄漏,因为每个元素和jQuery.cache之间的连接将被切断,并且数据(可能更多)将在缓存中处于孤立状态。

删除/覆盖内容时坚持使用jQuery方法,你会没事的。

即使这样做:

$('#container').html('');

... jQuery将清理受影响元素的数据。

答案 1 :(得分:0)

如果所有匿名函数都显示警告,那么我将在循环外定义函数,并按名称引用它。这样,它只会被创建一次,而不是20次。

var clickHandler = function(){ alert('Hello'); };

for (var i=0; i < 20; i++) {
    var itemButton = $('<button />').click(clickHandler).append('Hello');
    $('#container').append(itemButton);                            
}

如果它使用闭包,则会有所不同,但这似乎并非如此。