Javascript匿名函数

Javascript匿名函数,javascript,jquery,Javascript,Jquery,我有以下代码: for (var i=0; i < 20; i++) { var itemButton = $('<button />').click(function(){ alert('Hello'); }).append('Hello'); $('#container').append(itemButton); } 我创建了很多按钮,每个按钮都有onclick功能。然后我使用$shopSearchT

我有以下代码:

for (var i=0; i < 20; i++) {
    var itemButton = $('<button />').click(function(){ alert('Hello'); }).append('Hello');
    $('#container').append(itemButton);                            
}
我创建了很多按钮,每个按钮都有onclick功能。然后我使用$shopSearchTopBar.empty清除容器;然后再次创建按钮


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

这些函数存储在jQuery.cache中

只要使用.empty之类的jQuery方法,所有受影响元素的数据都将被清除

如果您这样做:

document.getElementById('container').innerHTML = '';
然后您可能会有一个非常严重的内存泄漏,因为每个元素和jQuery.cache之间的连接都会被切断,并且这些数据和更多数据可能会孤立地存放在缓存中

删除/覆盖内容时,请坚持使用jQuery方法,这样您就不会有问题了

即使这样做:

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

…jQuery将清除受影响元素的数据。

这些函数存储在jQuery.cache中

只要使用.empty之类的jQuery方法,所有受影响元素的数据都将被清除

如果您这样做:

document.getElementById('container').innerHTML = '';
然后您可能会有一个非常严重的内存泄漏,因为每个元素和jQuery.cache之间的连接都会被切断,并且这些数据和更多数据可能会孤立地存放在缓存中

删除/覆盖内容时,请坚持使用jQuery方法,这样您就不会有问题了

即使这样做:

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

…jQuery将清除受影响元素的数据。

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

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

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

如果它使用闭包,情况就不同了,但这里似乎不是这样。

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

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

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


如果它使用闭包,则会有所不同,但这里的情况似乎不是这样。

我会使用绑定而不是单击,这不是您呈现它的方式。@yoda:在分配处理程序时,绑定和单击在功能上没有区别。@patrick dw:有,请检查:您可以使用它来缩短代码。另外,如果标记经常更改,我建议使用live。@尤达:我想我不知道你的意思。对.clickfn的调用只是对.bind'click',fn调用的包装,所以我不明白bind版本是如何缩短这段代码的。bind还有其他一些用途,可以缩短一点,但它们与问题无关。@patrick dw:这是一个建议。我会使用bind而不是click,而不是你现在的表达方式。@yoda:在分配处理程序时,bind和click在功能上没有区别。@patrick dw:有,检查它:您可以使用它来缩短代码。另外,如果标记经常更改,我建议使用live。@尤达:我想我不知道你的意思。对.clickfn的调用只是对.bind'click',fn调用的包装,所以我不明白bind版本是如何缩短这段代码的。bind还有其他一些用途,可以缩短一点,但它们与这个问题无关。@patrick dw:这是一个建议。@patrick dw:html没有清除DOM,就我测试的情况而言。@yoda:是的。你需要像我在回答中那样传递空引号。@patrick dw:那是标记,不是DOM。无论如何,我已经有一段时间没有遇到这个问题了,不知道它是否同时得到了解决。@yoda:jQuery只在DOM上运行。标记来自服务器。您可以添加标记,但它是使用DOM方法/属性添加的,然后成为DOM的一部分。编辑:@patrick dw:。。你赢了这一轮。如果我能抽出时间进行测试,我会把反馈留在这里@patrick dw:据我测试,html没有清除DOM。@yoda:是的。你需要像我在回答中那样传递空引号。@patrick dw:那是标记,不是DOM。无论如何,我已经有一段时间没有遇到这个问题了,不知道它是否同时得到了解决。@yoda:jQuery只在DOM上运行。标记来自服务器。您可以添加标记,但它是使用DOM方法/属性添加的,然后成为DOM的一部分。编辑:@patrick dw:。。你赢了这一轮。如果我能抽出时间进行测试,我会把反馈留在这里我使用just alert来简化我的示例。这些函数做的更多,而且它们使用$this,所以我不认为我可以像你建议的那样使用循环之外的函数。是的,你是对的。我更关注内存泄漏方面。就效率而言,不应该在循环中构造相同的函数。通过创建命名函数,您可以共享
丹尼尔:这样用也没关系。当调用函数时,将分配该值。最终,当您将处理程序分配给像$'.someElements.clickfunction{}这样的几个元素时,jQuery实际上也在做同样的事情,在不同的元素之间使用对函数的共享引用。我只是更新了我的代码,并按照建议使用,效果很好。谢谢。我用just alert来简化我的示例。这些函数做的更多,而且它们使用$this,所以我不认为我可以像你建议的那样使用循环之外的函数。是的,你是对的。我更关注内存泄漏方面。就效率而言,不应该在循环中构造相同的函数。通过创建命名函数,您可以共享单个实例。@daniels:这样使用也可以。当调用函数时,将分配该值。最终,当您将处理程序分配给像$'.someElements.clickfunction{}这样的几个元素时,jQuery实际上也在做同样的事情,在不同的元素之间使用对函数的共享引用。我只是更新了我的代码,并按照建议使用,效果很好。谢谢