2017-09-01 39 views
-2

所以我有這段代碼的setTimeout不工作...當關閉包含

var string = 'qwe'; 

document.addEventListener('click', function(e){ 

    function bar(b){ 

     var a = string[b]; 
     if (a == 'q') { 
      console.log('first'); 
     } 
     if (a == 'w') { 
      console.log('second'); 
     } 
     if (a == 'e') { 
      console.log('third'); 
     } 

    }  
    setTimeout(bar(0), 1000); 
}); 

問題是的setTimeout不起作用。代碼在單擊後執行。

這很奇怪,因爲如果我避免使用閉合,它的工作原理...

setTimeout(function bar(){ 
    var a = string[0]; 
    //...everything else 
},1000); 

但是,這可能會使代碼凌亂/多餘的,因爲我打算做3次。理想情況下,工作代碼是...

setTimeout(bar(0), 1000); 
setTimeout(bar(1), 2000); 
setTimeout(bar(2), 3000); 

但同樣,這樣的設置超時不適合某些原因:/任何想法,爲什麼?

+4

使用'的setTimeout(()=>酒吧(0) ,1000)'排隊一個函數。您只需排列函數的**結果**。 – Sirko

+0

您立即執行該功能。 '巴(0)'。具有諷刺意味的是創建一個閉包會有所幫助,但在這裏你只是做了一個簡單的函數 – Keith

+0

給定'foo(bar())','bar'總是先執行,其返回值傳遞給'foo'。對於'setTimeout',這種行爲不會奇蹟般的改變。 –

回答

0
setTimeout(bar(0), 1000); 

在這裏setTimeout需要一個函數,但它會得到bar(0)。因此,儘管嘗試初始化巴(0)被調用時,你必須使用

setTimeout(() => bar(0), 1000) 

,使其工作,因爲現在它返回一個函數

+1

請查找這些基本問題的重複內容。回答一個可能的欺騙可能會吸引不需要的評論/投票 – Rajesh

+0

是的,我看到它是一個可能的問題重複,但它也回答了爲什麼立即調用bar(0) – marvel308