2017-09-07 6 views
1

私はこの投稿からjs closureについて学んでいます:How do JavaScript closures work?コールバック/クロージャ/引数を使用してjsでループする

私は実験をしたかったので、関数自体にコールバックを使用する関数を作成してループを作成しようとしました。引数を増やして結果を表示します。

最初は私が私が私の引数をインクリメントする方法を変更し、それが働いたthentを働いていなかった。

function test1(i1){ 
    console.log("test1 : "+i1.toString()); 
    setTimeout(function(){test1(i1++);},2500); 
} 

function test2(i2){ 
    console.log("test2 : "+i2.toString()); 
    setTimeout(function(){test2(++i2);},2500); 
} 

test1(0); 
test2(0); 

だけ私に ++をする++ を変更しました。

出力は次のようになります。

test1 : 0 
test2 : 0 
undefined 
test1 : 0 
test2 : 1 
test1 : 0 
test2 : 2 
test1 : 0 
test2 : 3 
test1 : 0 
test2 : 4 
test1 : 0 
test2 : 5 

最初のステップは、動作しないのはなぜ?

編集2: 私は++と++の間の差異を知っていますが、とにかく動作してはいけませんか?

編集: は確かにそれは

+1

閉鎖や実行の順番とは関係ありません。 Nice edit :) – George

答えて

3

function test1(i1){ 
    console.log("test1 : "+i1.toString()); 
    setTimeout(function(){test1(i1++);},2500); 
} 

にあなたは常にI1の同じ値を持つ)(TEST1を呼び出し、それを増加している...クロージャとは何かを持っています。

あなたは常に値0でそれを呼び出しているので、一方、他の機能で

function test2(i2){ 
    console.log("test2 : "+i2.toString()); 
    setTimeout(function(){test2(++i2);},2500); 
} 

出力

test1(i1++) 

はそれが

test1(i1); // it is always getting called with value = 0 
i1++; // later being incremented but not used 

と同等であるとして、あなたは0を取得します

と等価です。
+0

なぜ、それがtest1に渡す前にi1 **をインクリメントしないのですか? 関数が開始されると計算が行われますか? 計算結果を渡すのではなく、計算結果を渡すのですか? 「はい」の場合、それはtest2に渡す++ i2(以前?)を「実行」する理由は何ですか? –

+1

i1 ++は、i1の現在の値を渡して次のステップでインクリメントすることを意味します。++ i2は最初にインクリメントすることを意味し、 – marvel308

+0

に渡します。 ありがとうございました! –

関連する問題