[解決済み] 無名関数の使用はパフォーマンスに影響しますか?
質問
Javascriptで名前付き関数と匿名関数を使用した場合、パフォーマンスに違いがあるのでしょうか?
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;
}
前者はめったに使わない関数でコードを散らかさないのですっきりしていますが、その関数を何度も宣言していることは問題でしょうか?
どのように解決するのですか?
ここでのパフォーマンスの問題は、ループの各反復で新しい関数オブジェクトを作成するコストであり、無名関数を使用しているという事実ではありません。
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は両者を若干異なるものとして扱います。この違いを理解するためには、" JavaScript の関数宣言のあいまいさ ".
どのようなアプローチであっても、実際の実行時間は、ブラウザのコンパイラとランタイムの実装によって大きく左右されます。最近のブラウザのパフォーマンスの完全な比較については、以下を参照してください。 JS Perf サイト
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] JSHintの'+'前の改行不良の説明
-
[解決済み] Node.jsのES6クラスをrequireで作る
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
-
[解決済み] 変異を伴わないオブジェクトからの値の削除
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ