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

Memory overhead of anonymous functions vs named functions when used as Jquery callbacks

本文关键字:函数 内存 开销 Jquery 用作 回调      更新时间:2023-09-26

我正在学习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函数,它无法承受对性能的影响。