2014-02-10 39 views
0

我想以不同的方式命名很多setTimeouts,以便我可以單獨清除每個setTimeout。我嘗試以下方法:如何將一個變量添加到setTimeout名稱?

for(i=0; i<5; i++){ 

    var wordTimeout = i + "_T_i_m_e_o_u_t";  
    clearTimeout(wordTimeout); 

    var wordTimeout = setTimeout(function() { console.log(i + ' timeout called');}, 2000); 
    console.log(i); 
} 

http://jsfiddle.net/NU4E8/2/

但它看起來像我改名wordTimeout,然後變量並不重要。理想情況下,在這個例子中,所有的setTimeouts被調用後都會被單獨清除。所以沒有超時會出現在日誌中。謝謝。

+0

我想你想使用一個數組? – Bergi

回答

4

你不能說出自己的超時。 setTimeoutsetInterval返回一個數字ID,這是必須傳遞到clearTimetout。你可以,但是,使用數組或對象來存儲您的超時:

var timeoutIds = []; 
for(var i=0; i<5; i++){ 
    timeoutIds.push(setTimeout(function(){ /* ... */ })); 
} 

或者,如果你需要他們的名字,你可以做這樣的:

var timeoutIds = {}; 
for(var i=0; i<5; i++){ 
    timeoutIds['timeout_' + i] = setTimeout(function(){ /* ... */ }); 
} 

你也應該意識到在你的循環中,正如你所寫的那樣,所有超時都會打印'4 timeout timeout';這是因爲這些函數是在包含i的閉包中聲明的,並且在它們開始執行時,循環將完成,並且具有最終值4(除非它被相同範圍中的其他代碼重用,課程)。你可能想要做的是這樣的:

var timeoutIds = []; 
for(var i=0; i<5; i++){ 
    timeoutIds.push(
     (function(i){ 
      // i now captured as a function-scope variable 
      return setTimeout(function(){ console.log(i + ' timeout called'); }); 
     })(i) 
    ); 
} 

這將創建一個immediately-invoked function expression (IIFE),其「捕獲」作爲一個函數範圍的變量的i值。

3

可以創建一個陣列和使用該索引作爲像

var timers = []; 
for (i = 0; i < 5; i++) { 
    timers.push(setTimeout(function() { 
     console.log(i + ' timeout called'); 
    }, 2000)); 
    console.log(i); 
} 

密鑰存儲在那裏定時器參考文獻,然後使用定時器訪問計時器參考爲i=0 [0]


你必須另一個常見的問題稱爲在迴路中使用閉合變量

+2

請記住'我'的範圍。 – Bergi

+0

@Bergi該死的......沒有專注於 –

+0

@Bergi更新引用應該幫助解決它 –

0

創建一個數組,你將存儲由各setTimeout調用返回的數字。

var timeouts=[]; 
for(i=0; i<5; i++){  
    clearTimeout(timeouts[i]); 
    timeouts[i]=setTimeout((function(){ 
     console.log(this.i+' timeout called'); 
    }).bind({i:i}),2000); 
    console.log(i); 
} 

然後,當你需要做清算,你將不得不i存儲超時數。

.bind訣竅是因爲i的範圍。

+0

的'bind'招混合範圍與背景...似乎很短,但比較難看。 – Bergi

相關問題