2012-01-06 132 views
0

fourI我寫了一個循環javascript和我肯定已經做了可怕的工作:爲什麼我的JavaScript for循環無法正常工作?

init = function() { 

    var i = 0; 

    timer = setInterval(function() { 

     if (i >= 4) { 
      clearInterval(timer); 
      return; 
     } 

     for (i = 0; i < 10; i++) { 
      console.log('init fired'); 
     } 

    }, 2000); 

}; 

init(); 

我要的是定時器在for循環的i變量達到四後停止。相反,日誌會顯示init fired十次。我究竟做錯了什麼?

+0

它不是很清楚你在問什麼 – 2012-01-06 14:27:39

+0

@ DanielA.White我在問:我如何獲得'init fired'只輸出到控制檯四次? – 2012-01-06 14:30:09

+0

我想根據一定的條件來中斷setInterval定時器。 – 2012-01-06 14:30:53

回答

2

每次超時處理程序運行時,都會將「i」開始回零。

的問題你的「for」循環基本上,你不應該使用「for」循環:-)

這10次迭代發生在第一次通過該功能。第一遍之後,「​​我」將是10,所以「如果」條件將取消超時。但是,該「if」檢查僅在函數的開始處進行,因此循環將始終完成10次迭代。

如果您只想定時器(或五個或其他)的四次迭代,您只需要停止「for」循環,並在控制檯日誌消息之後添加i++;。這樣,計時器在運行時會發出一個日誌輸出,當發生這種情況時,您希望的次數會停止。

+0

啊我正在尋找那種解釋。現在我懂了。 – 2012-01-06 14:41:36

3

我認爲你需要像這樣

var i=0; //Global Declaration 
init = function(){ 

    timer = setInterval(function(){ 
      console.log('init fired'); 
      i++; 
     if(i>4){ 
     clearInterval(timer); 
     return; } 

    }, 2000); 

}; 

init(); 

希望這能解決你的問題。這將觸發init()方法四次,如果你已經預期到了,並且如果我到達了4,那麼間隔將被清除。

+0

是的,這也是。你能告訴我爲什麼'我'變量需要全球? – 2012-01-06 14:45:05

+0

因爲當我被設置爲全局唯一時,它的值將不會受到干擾,否則每次調用init時都會將其設置爲零。所以增量選項對i沒有影響 – AmGates 2012-01-06 14:51:32