0

以下の方法の使用の違いは何ですか?

最初の方法:

for(var i = 0; i < 10; i++) {
    (function(e){
        setTimeout(function() {
            console.log(e); 
        }, 1000);
    })(i);
}

for(var i = 0; i < 10; i++) {
    createTimeoutFunction(i);
}

2番目の方法:

function createTimeoutFunction(e){ 
    setTimeout(function() {
        console.log(e); 
    }, 1000);
}

for(var i = 0; i < 10; i++) {
    createTimeoutFunction(i);
}

私はノードjsが初めてで、クロージャーを使用しています。どちらのメソッドも同じ出力を返しますが、2 番目のメソッドはエラーで実行されます。最初の方法のように 2 つのループを使用する必要がある理由がわかりません。2番目の方法のように実行することはできませんか?

4

2 に答える 2

1

最初のメソッドで2番目のメソッドを削除forします。これは、ループを2回実行する必要がない限り、最初のメソッドですべてがすでに行われているため、冗長であるためです。createTimeoutFunction2番目の方法とは対照的に、最初のループの範囲外で定義されることはないため、2番目のループは失敗します。

それ以外は、どちらも同じ結果になります。2番目の方法の唯一の違いcreateTimeoutFunctionは再利用可能です。

参照:JavaScriptクロージャはどのように機能しますか?

于 2012-08-22T11:33:39.760 に答える
0

JavaScript のクロージャーは、使用している環境やインタープリターに関係なく同じように機能します。

クロージャは、コードのセットが実行される特定の変数スコープを提供します。クロージャーは、それ自体で定義されたすべてのもの、およびそれを囲むクロージャーで定義されたすべてのオブジェクトに (明らかに) アクセスできます。

コードを作成する際の問題は、最初の例createTimeoutFunctionがどこにも定義されていないことです。これを呼び出すと失敗します。その例では:

(function(e){
    setTimeout(function() {
        console.log(e); 
    }, 1000);
})(i);

このクロージャ内で定義されている関数は無名関数です。プロパティがnameなく、参照できません。

createTimeoutFunction2 番目のバージョンは、グローバル オブジェクトの一部であるため、ページの ANY クロージャでアクセスできるグローバル変数を定義します。(まあ、このコードが他のものに囲まれていることを示していないので、そう思います)。

于 2012-08-22T11:38:49.020 に答える