javaScriptのset TimeOut()


もっと読む
setTimeoutを使用する場合、4回実行すると以下のような例があります。
for (var i = 0; i < 4; i++)
  {
      console.log("A="+i);
      function A(){
          console.log("B="+i);
      }
      window.setTimeout(A, 0);

  }
一般常識的な判断の結果は、
A=0
B=0
A=1
B=1
A=2
B=2
A=3
B=3
実際の結果は以下の通りです。
A=0
A=1
A=2
A=3
B=4
B=4
B=4
B=4
おかしいと思いますか?
これはjavascriptが単一の実行順に属していて、window.setTimeout(A,0)が見えます。すぐ実行されるようですが、forループ内のsetTimeoutは、forループが終了するまで、代用のスタックに入れておきます。これで終了すると、iは4となります。結果として、積み重ねられた各実行タスクのiは4となります。
だから、いい書き方は:

                   
                        
        
    


        
          var i = 0;
          function doAppend(){
              if (i++ >= 4){
                  return;
              }
              console.log("B="+i);
              setTimeout(doAppend, 0);
          }//    。    ,    。
          console.log(i);//i=0
          setTimeout(doAppend, 0);//    
         
        
    
上の例と何が違いますか?上のsetTimeoutはそれぞれ独立しています。この例のsetTimeoutは一環として接続されています。そうすると、各setTimeoutは正しいiがあります。
を選択します。
また、タイマーをクリアするには、タイミング時に発生するID ID ID ID IDをclearTimeoutまたはclearInterval関数に渡すことによって、タイミングをクリアしても良いし、どの関数を使うかは呼び出し時に使うのがsetTimeoutかsetIntervalかによって決まります。サンプルは以下の通りです
var id = setTimeout ( foo ,  1000 ); 
clearTimeout ( id );
すべてのタイマーをクリアすると仮定しますが、内蔵しているタイマーを取り除く方法がないので、暴力的な方法でこの目的を達成することができます。
//  "  "    
for ( var i =  1 ; i <  1000 ; i ++)  { 
    clearTimeout ( i ); 
}
上のコードからクリアされないタイマーがあるかもしれません。(タイマーが起動した時に戻ってきたIDの値が1000より大きい場合)、事前にすべてのタイマーIDを保存してからクリアします。
ref:
1、Javascript:setTimeout
http://smlsun.com/blog/2013/02/01/javascript-settimeout/
2、JavaScriptはマルチスレッドがありますか?JavaScriptタイミングメカニズムを深く理解する
http://www.phpv.net/html/1700.html
を選択します。