这里的性能问题是在循环的每次迭代中创建新函数对象的成本,而不是您使用匿名函数的事实:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
// do something
};
}
您正在创建一千个不同的函数对象,即使它们具有相同的代码体并且没有绑定到词法范围(闭包)。另一方面,以下似乎更快,因为它只是将相同的函数引用分配给整个循环中的数组元素:
function myEventHandler() {
// do something
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
如果您要在进入循环之前创建匿名函数,然后仅在循环内将对其的引用分配给数组元素,您会发现与命名函数版本相比没有任何性能或语义差异:
var handler = function() {
// do something
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
简而言之,在命名函数上使用匿名并没有明显的性能成本。
顺便说一句,从上面看起来可能没有区别:
function myEventHandler() { /* ... */ }
和:
var myEventHandler = function() { /* ... */ }
前者是函数声明,而后者是对匿名函数的变量赋值。尽管它们看起来具有相同的效果,但 JavaScript 对它们的处理确实略有不同。要了解差异,我建议阅读“<a href="http://www.dustindiaz.com/javascript-function-declaration-ambiguity/" rel="noreferrer">JavaScript 函数声明歧义”。
任何方法的实际执行时间很大程度上取决于浏览器对编译器和运行时的实现。有关现代浏览器性能的完整比较,请访问JS Perf 站点