我有以下代码:
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 个新按钮,每个按钮都有自己的新匿名函数?
最佳答案
这些函数存储在 jQuery.cache
中。
只要您使用像 .empty()
这样的 jQuery 方法,所有受影响的元素的数据都会被清除。
如果你做了这样的事情:
document.getElementById('container').innerHTML = '';
那么您可能会遇到非常严重的内存泄漏,因为每个元素与 jQuery.cache
之间的连接将被切断,并且数据(可能还有更多)将孤立地存放在缓存中。
在删除/覆盖内容时坚持使用 jQuery 方法,你会没事的。
即使这样做:
$('#container').html('');
...jQuery 将清理受影响元素的数据。
关于JavaScript 匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4879686/