2013-11-26 33 views
1

我工作的這個代碼之謎從here的Javascript:setTimeout的,for循環,並

這裏回調函數是我到目前爲止有:

for (var i = 0; i < 1000; i += 100) { 
    waitFor(i, function then() { 
    console.log(i) 
    }) 
} 

// this will run a callback function after waiting milliseconds 
function waitFor(milliseconds, callback) { 
    setTimeout(callback.apply(), milliseconds) 
} 

此註銷0至900,但它一次完成,然後在最後等待900毫秒(而不是等待每個console.log之間的毫秒)。

任何人都可以幫助我理解這一點嗎?

+0

答案給原始是在這裏:http://stackoverflow.com/q/750486/989121 – georg

+0

謝謝thg435我會看看那個。 – Ber

回答

0

你有事情在你的代碼的兩個不同的問題:

  1. 閉包是導致價值1000總是印刷,而不是100200 ...等
  2. 您正在使用的超時太總之,功能正在迅速地執行。

第一個問題很難在單個答案中解釋,但我會嘗試給你一些見解,因爲將變量的值打印到控制檯的函數是在for循環中定義的,該函數永遠保持這種在那裏,當循環結束,在您的情況,這是1000i值。

爲了解決這個問題,就需要類似於@ thg435在他的評論中提到的東西,這樣的事情:

// this will run a callback function after waiting milliseconds 
function waitFor(milliseconds, callback) { 
    setTimeout(callback, milliseconds); 
} 

function createFunction(i) { 
    return function() { console.log(i); }; 
} 

for (var i = 0; i < 1000; i += 100) { 
    waitFor(i, createFunction(i)); 
} 

第二個問題是,對於超時值實際上都是值是i採取其是循環它們是100200 ...等等這些都是非常小的值不到一秒鐘,所以當for循環結束,這些功能都將準備好執行,使他們在其他以後得到立即執行一個。

爲了解決這個問題,你需要乘以i通過10例如使用一個更大的時間間隔,如下所示:當循環將完成

waitFor(i*10, createFunction(i)); 
     ^^^^ 
+0

我試過了,它立即註銷了「1000」10次。 – Ber

+0

@Ber我已經完全修改我的回答到一個新的,請編輯。當我第一次回答時,我非常忙碌,我把所有事情搞砸了,對此抱歉。 –

+0

感謝嗅探器的解釋,我修改沿着這些線路的代碼和它的作品吧! – Ber

0

首先計時器的通話將被happenned。在這種情況下,由於JS使用引用而不是值,所以i = 1000。要解決這種情況,你必須使用閉包。