O problema de desempenho aqui é o custo de criar um novo objeto de função a cada iteração do loop e não o fato de você usar uma função anônima:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
Você está criando milhares de objetos de função distintos, embora eles tenham o mesmo corpo de código e nenhuma vinculação ao escopo léxico ( encerramento ). O seguinte parece mais rápido, por outro lado, porque simplesmente atribui a mesma referência de função aos elementos da matriz em todo o loop:
function myEventHandler() {
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Se você criasse a função anônima antes de entrar no loop, apenas atribua referências a ela aos elementos da matriz enquanto estiver dentro do loop, você descobrirá que não há nenhuma diferença de desempenho ou semântica em comparação com a versão da função nomeada:
var handler = function() {
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
Resumindo, não há custo de desempenho observável no uso de funções anônimas em vez de nomeadas.
Como um aparte, pode parecer de cima que não há diferença entre:
function myEventHandler() { }
e:
var myEventHandler = function() { }
O primeiro é uma declaração de função, enquanto o último é uma atribuição de variável a uma função anônima. Embora possam parecer ter o mesmo efeito, o JavaScript os trata de maneira um pouco diferente. Para entender a diferença, recomendo a leitura, “ Ambigüidade da declaração da função JavaScript ”.
O tempo de execução real para qualquer abordagem será amplamente ditado pela implementação do navegador do compilador e do tempo de execução. Para uma comparação completa do desempenho do navegador moderno, visite o site JS Perf