3

関数の配置は、スコープ内のクロージャのパフォーマンスに影響を与えますか?もしそうなら、これらの機能を配置するのに最適な場所はどこですか?そうでない場合、クロージャによる暗黙の関連付けは、関数を論理的に別の場所に配置するのに十分な理由ですか?

たとえば、fooがlocalStateの値に依存しない場合、 localStateがfooからアクセス可能であるという事実は、fooの実行時間、メモリ使用量などに影響を及ぼしますか?

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();

言い換えれば、これはより良い選択でしょうか?もしそうなら、なぜですか?

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();

ダリウスベーコンは、 localStateはブロック内のどこからでもアクセスできるため、上記の2つのサンプルは同一であると以下に示唆しています。ただし、fooがブロックの外部で定義されている以下の例は、別のケースである可能性があります。どう思いますか?

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();
4

6 に答える 6

5

これらのスニペットはどちらも、作成している無名関数の(同じ)環境で定義されているため、同等です。どちらの方法localStateからでもアクセスできると思います。foo

そうは言っても...作成している環境に不当な量の変数がある場合、foo変数のルックアップに時間がかかる可能性があるため、の実行時間が影響を受ける可能性があります。定義した関数で使用しなくなった変数が大量にあり、それらも必要foofooしない場合、それらはfooガベージコレクションされないため、これも問題になる可能性があります。

于 2008-10-28T16:23:27.483 に答える
5

宣言の順序が、JavaScript インタープリターによって抽象化されるものであることを願っています。いずれにせよ、パフォーマンスの違いがあったとしても、時期尚早の最適化の弊害のポスターの子になるほど最小限のものです。

于 2008-10-28T20:46:53.210 に答える
3

Javascript のすべての関数はクロージャーです。変数の値を解決するためのランタイムは、変数が関数によって参照されている場合にのみ発生します。たとえば、この例の関数 y では、x が y によって直接参照されていなくても、x の値をキャプチャします。

var x = 3;
function y() eval("x");
y();
3
于 2008-10-29T14:12:34.423 に答える
2

javaスクリプトは関数スタックの概念を使用しないため、パフォーマンスのオーバーヘッドはないと思います。字句スコープをサポートします。同じ状態がクロージャコール全体で実行されます。ちなみに、あなたの例では、ステートメントを実行していないようです。

于 2008-10-28T16:22:35.583 に答える
1

varまたはfunction宣言のスコープは、宣言がブロック内のどこにあるかに関係なく、それが表示されるブロック全体です。ですから、それが効率に影響を与えるのは驚くべきことです。

つまり、「function foo()」がこのブロック内の「varlocalState」の前にあるか後にあるかは関係ありません。「functionfoo()」がこのブロックにあるか、それを囲むブロックにあるかが重要になる場合があります(ローカル変数を使用しないため、より高いスコープに引き上げることができる場合これは、Javascriptコンパイラの詳細によって異なります。

于 2008-10-28T16:22:15.740 に答える
0

あなたの例では、違いはそれほど重要ではありません。foo がグローバルスコープにある場合でも、問題はありません。

ただし、関数を変数に割り当てるスタイルを使用して関数を宣言する場合、それらが宣言される順序が非常に問題になる可能性があることに注意してください。

より良いアイデアを得るには、次の 2 つの例を試してください。

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};

2 番目と 1 番目の唯一の違いは、関数の宣言に使用するスタイルです。2 つ目は参照エラーを生成します。

乾杯。

于 2009-08-14T14:44:13.413 に答える