Javascript jQuery事件回调速度:匿名与命名函数

Javascript jQuery事件回调速度:匿名与命名函数,javascript,jquery,callback,jquery-events,jsperf,Javascript,Jquery,Callback,Jquery Events,Jsperf,这是一个随机的问题,但我想知道为什么命名回调相对于匿名函数而言,对于单击事件的性能更差 下面是我在Firefox和Chrome Mac上运行的测试的链接 我猜我的假设是命名回调总是表现得更好。例如,当使用时,每个都会调用指定的回调 谢谢你的时间 编辑我编辑了。每个JSPerf测试都是因为(a)我没有测试我的意思,(b)我试图模拟更多的事件 编辑2我的测试设置从一开始就不正确,@Esailija在下面指出。这个问题有些毫无意义,但至少它可能会帮助某些人进行JSPerf测试。匿名函数作为参数传递,因

这是一个随机的问题,但我想知道为什么命名回调相对于匿名函数而言,对于单击事件的性能更差

下面是我在Firefox和Chrome Mac上运行的测试的链接

我猜我的假设是命名回调总是表现得更好。例如,当使用
时,每个
都会调用指定的回调

谢谢你的时间

编辑我编辑了
。每个
JSPerf测试都是因为(a)我没有测试我的意思,(b)我试图模拟更多的事件


编辑2我的测试设置从一开始就不正确,@Esailija在下面指出。这个问题有些毫无意义,但至少它可能会帮助某些人进行JSPerf测试。

匿名函数作为参数传递,因此为了解析其引用,作用域链不会一直返回到创建它的父函数-它只作为参数存在。另一方面,为了解析对命名函数的引用,作用域链会一直追溯到父函数闭包,在父函数闭包中创建了命名函数

编辑: 我试图证明这一点,但似乎匿名函数实际上并没有更快地得到解析-

编辑:如果调用
a.off()
要删除任何事件处理程序,命名函数的速度将与解析匿名函数的速度相同或更快


jsperf被破坏,因为您跨测试边界累积事件处理程序。在其他WROD中,无论首先运行什么测试,都将是“最快的”


测试的整个前提是荒谬的,如果其他条件都相同,那么有名称的函数和没有名称的函数之间没有区别。只有在错误地设置jsperf时,您才会看到差异。当您不断地为它们获得相同的结果时,您就知道您已经正确地设置了它-但您已经从常识中了解到了这一点:)

您的jsperf with
。每个
都不是一个好的测试,因为匿名函数必须在每次迭代期间创建和传递,但是命名函数不需要在每次迭代中创建,我理解这一点。我只是用它作比较。谢谢你的回答。您的答案是否与此相关:。我可能会感到困惑,但我认为
cbu d
会是最快的。我也会这么想。首先用
$.fn.off()
删除事件处理程序似乎可以解决这个问题。但这真的会成为一个用例吗?在构建可能重新初始化的组件时,最好在附加新的事件处理程序之前删除所有旧的事件处理程序,即:
$(el).off('click.EventNamespace')。on('click.EventNamespace',function(){})如何避免跨测试边界累积事件处理程序?我会像@Kavun建议的那样,通过调用teardown中的
.off
方法来实现吗?不过,我明白你的意思,最快的是跑在第一位的。谢谢你的帮助@doubleswirve技术上您甚至不需要jQuery,因为您正在测量函数调用速度。但是在像这样的测试之外只附加一次事件处理程序也是有效的:哦,我明白了。很抱歉给您带来困惑,谢谢您的耐心。我绝对不是在测试我的意图。再次感谢。