6

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

2 回答 2

3

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

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

于 2013-09-06T11:39:38.040 回答
2

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

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

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

于 2013-09-06T11:38:25.367 回答