-1
obj = [1,2,3,4,5];
function iter(){
    for (var key in obj){
        key=key+key;
    };
};
function test1() { 
    iter(obj); 
};
function test2(){
    (function iter(obj){
        for (var key in obj){
            key=key+key;
        };
    })(obj);    
};

ここでは、test2が呼び出されるたびに新しい関数を作成していると思われますが、test1とtest2の両方が同じように実行されます。なんで?

4

3 に答える 3

6

私の推測では、コードに(意味のある)違いがないため、パフォーマンスに違いはありません。パーサーは、コードを解析するときに、呼び出されるたびにではなく、iter内部にローカル関数を1回作成します。(これは使用するのとは異なります。)どちらかといえば、2番目のものは関数に対してローカルであるため、少し速くなります。test2test2evalobjiterまあ、それは間違っていました。

このjsperfテストが示すように、2番目は確かに遅いです。測定には注意が必要です。関数の記述方法、関数本体で実行される作業量は、2つのケースに関連する関数呼び出しのオーバーヘッドの違いを簡単に覆い隠します。また、最初のケースはグローバルobjにアクセスし、2番目のケースは引数にアクセスします。これらの違いは、可能な限り、測定しようとしているものだけを測定するために排除する必要があります。私が書いたjsperfテストは、まさにそれを実行しようとします。

于 2013-01-18T20:36:42.597 に答える
1

たった5サイクルでパフォーマンスの違いが見られないことをほぼ保証します。最新のJSエンジンでは、実際に違いを確認するために、数千または数万の範囲の反復でこれをテストする必要があります。ただし、その違いは最終的には確実に現れます。

于 2013-01-18T20:37:14.183 に答える
1

あなたは正しいです、彼らは多かれ少なかれ同じことをします

クロージャを持つ2番目の関数には、呼び出されるたびに無名関数を作成するオーバーヘッドがあります。

最初のものでは、jsはすでに保存されている関数を呼び出すことができます。

そのため、2番目の関数は少し遅くなります。

于 2013-01-18T20:41:01.707 に答える