3

Javascript の匿名関数と通常の関数のメモリ使用量に違いはありますか?

もしそうなら、どのように?説明できますか?

4

1 に答える 1

5

「通常の関数」とfunction a(){は、スクリプトのルートレベルで宣言された関数、つまりウィンドウオブジェクトにアタッチされた関数を意味する場合、はい、違いがあります:

  • ウィンドウオブジェクトにアタッチされた関数はガベージされませんが、無名関数は使用しなくなったらすぐにガベージできます。
  • ウィンドウ オブジェクトの他の変数へのアクセスが遅くなる可能性があります (ルート レベルで関数をアタッチすると、「グローバル名前空間が乱雑になる」と見なされることがありますが、これを回避する理由は、主に、よりクリーンなコードを作成し、名前の衝突を回避するためです)。
  • 無名関数はクロージャーです: それらは、このスコープで定義された変数の使用を可能にする、それを囲むスコープへのポインターを保持します。副作用は、このスコープを関数の前にガベージできないため、関数が思ったよりも「通常の関数」よりも重くなる可能性があることです (空のスコープを追加して匿名宣言を囲み、この効果を防​​ぐことができます。スコープの変数が必要ですが、javascriptエンジンが囲んでいるスコープの一部を最適化できるかどうかわからないので、循環参照を検出しない場合はそうしないことをお勧めします)。

しかし、これらの違いは通常は些細なものであり、通常は気にする必要はありません。ほとんどのページでは、イベント ハンドラーを削除しないため、無名関数がガベージされることはありません (通常、無名関数の最初の根本原因)。

全体的に (時期尚早の最適化はルートなどです) ガベージの問題がない限り、読みやすさを優先することをお勧めします。Javascript エンジンとその GC は頻繁に変更されるため、努力が無駄になる可能性があります。

Google は、クロージャとメモリに関する興味深い通知を持っています。

于 2012-06-28T08:53:14.033 に答える