我正在学习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));
答案 0 :(得分:3)
当你使用命名函数时,它只存在于一个全局闭包上,但如果你在运行时定义函数,它们会在(父函数的闭包)中创建一个新的闭包,导致父变量被保留,即使你做了不再需要那个功能了。
简而言之,只有在需要访问位于父函数中的变量时才尝试使用匿名函数。匿名函数几乎总是比命名函数更昂贵。但是在全局闭包中定义的命名函数,污染全局命名空间,自己决定。
答案 1 :(得分:2)
按照设计,the observer pattern只保留一个观察者实例。事件处理程序然后多次调用此观察者,其中包含事件对象的其他实例,其中包含事件参数:哪个元素触发事件,上下文是什么,等等。
因此处理程序不会重复,但会在每个主题的“侦听器存储”中引用。
注意:
Kemal Dag还指出匿名函数按定义提供的性能低于命名函数,我不知道它是否属实,但如果是,则差异可以忽略不计。特别是对于像JavaScript一样的语言,它使用非常广泛的功能,它不能对它产生性能影响。