这里的性能问题是在循环的每次迭代中创建新函数对象的成本,而不是您使用匿名函数的事实:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
即使它们具有相同的代码体并且没有绑定到词法范围(闭包),您仍在创建一千个不同的函数对象。另一方面,以下代码看起来更快,因为它在整个循环中只是将相同的函数引用分配给数组元素:
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网站。