1
 for(;i<5;i++)
 {
 (function(z){
  setTimeout(function(){console.log(z);},2000);})(i);
 }

これは 2 秒後に 0 1 2 3 4 5 を 1 ショットで出力します。そして、2秒後に各数字を印刷する解決策は何ですか.

4

6 に答える 6

1

タイムアウトには間隔を空ける必要があり、私は常に異なる変数を使用してそれぞれを保存するので、特定の変数で clearTimeout を実行できます

ライブデモ

var tIds=[];
for(var i=0;i<5;i++) {
 (function(z){
    tIds[i]=setTimeout(function(){window.console&&console.log(z);},2000*i); //fire 2000,4000,6000
  })(i);
 }

また、ドキュメントを読んで、2000+i が機能しないように見える理由を理解してください。

于 2013-07-02T05:55:38.577 に答える
1

setTimeout コードの実行を 2 秒間ブロックしません。実際setTimeoutにはすぐに戻り、ループが続きます。したがって、5 つの非同期呼び出しはすべて、タイムアウト後にほぼ同時にトリガーされます。

あなたが望むものに近づくために、私はこの再帰のようなバージョンが欲しい

関数 print(i) {
    if (i >= 5) 戻ります。

    console.log(i);
    setTimeout(関数 () {
        印刷 (i + 1);
    }、2000);
}

印刷 (0);
于 2013-07-02T06:06:57.153 に答える
1

このコードを使用してみてください。

    //Referring your code for better understanding..
    for(i=0;i<5;i++) {
     (function(z){
      setTimeout(function(){console.log(z);},2000*z);})(i);
     }
于 2013-07-02T05:57:06.703 に答える
1

関数の5 つの非同期呼び出しをほぼ同時に実行しています。

于 2013-07-02T05:59:14.510 に答える
0

を使用して差分アプローチを試すことができますsetInterval

var timer = setInterval(function(){printThing();},2000);

var i = 0;    
function printThing(){
  if(i<=5){
    window.console && console.log(i);
    ++i;
  }
  else{
    clearInterval(timer)
  }
}//end function

例はこちら http://jsfiddle.net/W9vS4/2/

于 2013-07-02T05:59:45.117 に答える
0

setTimeout(fn,delay)ミリ秒単位のfn遅延の後、指定された関数を実行します。delayしたがって、単純iに 2000 を掛けて次のように使用できます。

for(;i<5;i++)  {
   setTimeout(function(){console.log(z);},2000*i);
}

i内でレポートまたは使用する場合は、レポートまたは使用のクロージャをfn使用して、で使用する関数を返す関数を作成する必要があります。以下では、変数 を使用して囲まれています。これは、後で で使用する関数オブジェクトを作成する、すぐに呼び出される無名関数によって使用されます。setTimeoutiixfsetTimeout

for(var i=0;i<5;i++)
 {
   var f = function(x){
       return function(){console.log(z+'#'+x);}
   }(i);
   setTimeout(f,2000*i);
 }

jsフィドル

于 2013-07-02T06:10:32.647 に答える