2011-12-25 20 views
5

Javascriptのnoobに関する質問 - 次のうちのどれがベストプラクティスであり、パフォーマンスに優れているか、他の提案も歓迎します。これは元のプロジェクトの最も単純なバージョンです。 20以上の変数と10以上の内部関数があります(例: 'process')。Javascript - 引数Vsネストされた関数Vsパフォーマンス

方法1の利点は、関数に引数を送る必要はなく、main関数内のすべての関数をネストする(おそらく、Fooの各インスタンスのすべての内部関数を再生成する)ということです。メソッド2には関数のネストはありませんが、多くの引数が必要です。 Fooコンストラクタのインスタンスも複数存在することに注意してください。

方法1:

function Foo() { 
    var a = 1; 
    var b = 2; 
    var c = (a+b)/2; 
    var $element = $('#myElement'); 

    var process = function(){ 
     var x = a+b+c; 
     $element.css('left', x) 
     return x; 
    } 
    x = process(); 
} 

方法2:

function Foo() { 
    var a = 1; 
    var b = 2; 
    var c = (a+b)/2; 
    var $element = $('#myElement'); 
    x = process (a, b, c, $element); 
} 

function process (a, b, c, $element){ 
    $element.css('left', x) 
    return x; 
} 

答えて

4

分離機能は、間違いなく、パフォーマンスのために行く方法です。ネストされた関数の変数スコープが持つのが良いことがある状況がありますが、その関数が大きい場合、パフォーマンスヒットが大きくなる可能性があります。

Fooが呼び出されるたびに、varプロセスは関数をメモリに保持して新しいパラメータを渡すのではなく、作成中の新しい関数のすべてのメモリを再割り当てします。関数が大きい場合、これはJavascriptインタプリタにとって非常に激しい作業になるでしょう。実際にブラウザがパフォーマンスの違いを比較どこにでもネストされた関数を最適化しますhttp://jsperf.com/nested-functions-speedhttp://jsperf.com/nested-named-functions/5

+0

はい、分離された関数は、引数の数が増えてもパフォーマンスが向上します。答えをありがとう。 – user1106995

2

:ここ

にも役立つかもしれないいくつかのハード番号(あなたがあなた自身のブラウザで実行することができ、パフォーマンスの比較や実際のベンチマークを含みます)です外側のスコープで宣言された関数は無視されます。

私はmy findingsをブログし、このクレームをサポートするためにperformance testを作成しました。

編集:テストが壊れていました。after fixingテストでは機能がネストされていないことがわかりました。

+0

うーん...少し悪いですが、私はこれをブラウザの弱点と考えています。ネストされたコードを書くのはずっとうれしい!大好きです!すべての言語がこれをサポートし、非ローカル変数が使用されている場合に最適化されていることを願っています。 – momomo

関連する問題