Javascript 用作Jquery回调时匿名函数与命名函数的内存开销

Javascript 用作Jquery回调时匿名函数与命名函数的内存开销,javascript,jquery,Javascript,Jquery,我正在学习JS/JQuery以及匿名函数和闭包。我见过这样的例子: $('.button').click(function(){ /* Animations */ /* Other Stuff */ }); 如果有不止一个按钮,这不是很低效吗?这不就是在内存中存储匿名函数原型的类似副本吗?(纠正我的术语)这样做不是更好吗: function handleClick(){ /* Animations */ /* Other Stuff */ } ('.butto

我正在学习JS/JQuery以及匿名函数和闭包。我见过这样的例子:

$('.button').click(function(){
    /* Animations */
    /* Other Stuff */
});
如果有不止一个按钮,这不是很低效吗?这不就是在内存中存储匿名函数原型的类似副本吗?(纠正我的术语)这样做不是更好吗:

function handleClick(){
    /* Animations */
    /* Other Stuff */
}

('.button').click(handleClick);
或者,如果需要对按钮的引用:

function handleClick($obj){
    /* Animations */
    /* Other Stuff */
}
//multiple anon functions again, but they all reference ONE handleClick function
('.button').click((function($obj){         
     return function(){handleClick($obj)};
})($(this));
根据设计,只保留观察者的一个实例。然后,事件处理程序使用事件对象的其他实例多次调用该观察者,该事件对象包含事件参数:哪个元素触发了事件,什么是上下文,。。。等

因此,处理程序不是重复的,而是在每个主题的“侦听器存储”中引用的

注:

Kemal Dag还指出,根据定义,匿名函数提供的性能不如命名函数,我不知道这是否属实,但如果属实,差别可以忽略不计。特别是像JavaScript这样广泛使用anon函数的语言,它无法承受性能影响

当您使用命名函数时,它只存在于全局闭包中,但如果您在运行时定义函数,它们将在(父函数的闭包)新闭包中创建,从而导致在新闭包之后保留父变量,即使您不再需要该函数


简而言之,只有在需要访问父函数中的变量时,才尝试匿名函数。匿名函数几乎总是比命名函数更昂贵。但是在全局闭包中定义的命名函数会污染全局名称空间,由您自己决定。

我不认为您编写的第一个版本实际上“克隆”了处理程序。。。所有元素都应该共享相同的引用!所以JQuery足够聪明,可以只附加一个处理程序?我不认为这是JQuery的问题,你只传递一个函数引用,所以使用一个引用。可以想象JQuery可以将函数绑定到每个元素,这将为每个绑定创建另一个函数对象…我还没有查看源代码以确定是否是这样的情况…但这将是一个相当低效的操作,并且没有任何我可以看到的用途。