我有以下代码:
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个新按钮,每个按钮都有自己的新匿名函数吗?
答案 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);
}
如果它使用闭包,则会有所不同,但这似乎并非如此。