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

时间:2013-09-06 11:27:13

标签: javascript jquery

我正在学习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));

2 个答案:

答案 0 :(得分:3)

当你使用命名函数时,它只存在于一个全局闭包上,但如果你在运行时定义函数,它们会在(父函数的闭包)中创建一个新的闭包,导致父变量被保留,即使你做了不再需要那个功能了。

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

答案 1 :(得分:2)

按照设计,the observer pattern只保留一个观察者实例。事件处理程序然后多次调用此观察者,其中包含事件对象的其他实例,其中包含事件参数:哪个元素触发事件,上下文是什么,等等。

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

注意:
Kemal Dag还指出匿名函数按定义提供的性能低于命名函数,我不知道它是否属实,但如果是,则差异可以忽略不计。特别是对于像JavaScript一样的语言,它使用非常广泛的功能,它不能对它产生性能影响。