这里的性能问题在于每次循环都创建一个新的函数对象的成本,而不是使用匿名函数的事实:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
即使这些函数具有相同的代码主体并且没有绑定到词法作用域(闭包),您也创建了1000个不同的函数对象。另一方面,以下代码似乎更快,因为它只是将相同的函数引用分配给循环中的数组元素:
function myEventHandler() {
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
如果您在进入循环之前创建匿名函数,然后仅在循环内部将其引用分配给数组元素,您会发现与命名函数版本相比,性能或语义上没有任何区别:
var handler = function() {
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
简而言之,使用匿名函数与使用命名函数在性能方面没有明显的成本区别。
附带一提,从上面来看,似乎以下两种方式没有差别:
function myEventHandler() { }
和:
var myEventHandler = function() { }
前者是一个函数声明,而后者是对匿名函数的变量赋值。虽然它们可能看起来具有相同的效果,但JavaScript会稍微不同地处理它们。为了理解这种差异,我建议阅读“JavaScript函数声明的歧义”。
任何方法的实际执行时间很大程度上由浏览器实现的编译器和运行时决定。要完整比较现代浏览器的性能,请访问JS Perf网站。