随机的问题,但我想知道为什么命名回调相对于匿名函数而言,对于点击事件而言表现更差。
这是我在Mac上的Firefox和Chrome上运行的JSPerf测试的链接。
我想我的假设是命名回调总是表现得更好。例如,当使用.each
时,命名回调会稍微快一些。
谢谢你的时间!
编辑我编辑了.each
JSPerf测试,因为(a)我没有测试我的意思,(b)我试图更多地模仿事件。
编辑 2 我的测试设置从一开始就不正确,如下@Esailija指出。这个问题有点毫无意义,但至少它可能有助于某人进行 JSPerf 测试。
jsperf 被破坏,因为您跨测试边界累积事件处理程序。在其他 wrods 中,无论先运行什么测试,都将是"最快的"。
测试的整个前提是荒谬的,如果其他条件相同,则有名称的函数和没有名称的函数之间没有区别。只有当您错误地设置 jsperf 时,您才会看到差异。当您不断为它们获得相同的结果时,您就知道您设置正确 - 但您已经从常识中知道这一点:)
匿名函数作为参数传递,因此为了解析其引用,作用域链不会一直追溯到创建它的父函数 - 它仅作为参数存在。另一方面,为了解析对命名函数的引用,作用域链将一直追溯到创建命名函数的父函数闭包。
编辑:我试图证明这一点,但似乎匿名函数实际上并没有更快地解决 - http://jsperf.com/scope-chain-anonymous-function
编辑:如果调用a.off();
删除任何事件处理程序,则命名函数将与解析匿名函数一样快或更快。
- http://jsperf.com/jquery-events-anonymous-vs-named-callbacks/2
- http://jsperf.com/jquery-event-callback-nested/2