3

这是一个随机的问题,但我想知道为什么一个命名的回调执行得更差,对于一个点击事件,相对于一个匿名函数。

这是我在 Mac 上的 Firefox 和 Chrome 中运行的JSPerf测试的链接。

我想我的假设是命名回调总是会表现得更好。例如,当使用.each命名回调时会稍微快一些

谢谢你的时间!

编辑我编辑了.eachJSPerf 测试,因为(a)我没有测试我的意思,(b)我试图更多地模仿事件。

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

4

2 回答 2

2

jsperf 被破坏了,因为您跨越测试边界累积事件处理程序。换句话说,首先运行的任何测试都将是“最快的”。

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

于 2013-11-09T13:39:23.537 回答
1

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

编辑: 我试图证明这一点,但似乎匿名函数实际上并没有更快地得到解决 - http://jsperf.com/scope-chain-anonymous-function

编辑:如果您调用a.off();删除任何事件处理程序,命名函数将与解析匿名函数一样快或更快。

于 2013-11-07T03:32:31.883 回答