ここでのパフォーマンスの問題は、ループの各反復で新しい関数オブジェクトを作成するコストであり、無名関数を使用するという事実ではありません。
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関数宣言のあいまいさ」を読むことをお勧めします。
アプローチの実際の実行時間は、主にブラウザーのコンパイラーとランタイムの実装によって決まります。最新のブラウザパフォーマンスの完全な比較については、JSPerfサイトにアクセスしてください。