2016-04-09 33 views
0

我有以下代碼:函數名預計關閉

for(var i = 0; i <=3; i++){ 
    setTimeout(function(){ 
     var j = i; 
     function(){ 
      console.log(j); 
     } 
    }, 1000); 
} 

我收到的第二功能的錯誤「預期函數名稱」。我不明白爲什麼我不能在這裏使用匿名函數。

+0

OP,你期待的工作代碼後,其他登錄0-31秒? – Andy

回答

4

要創建一個封閉,並調用它馬上做到這一點:

(function(){ 
    console.log(j); 
}()); 

不過,實際上正確捕捉i的內部函數,你可以移動的功能了一下,把它傳遞i

for (var i = 0; i <= 3; i++) { 
    (function(i){ 
    setTimeout(function(){ 
     console.log(i); 
    }, 1000);}(i)); 
} 

而且,實際打印的數字後,對方1秒,你可以這樣做:

for (var i = 0; i <= 3; i++) { 
    (function(i){ 
    setTimeout(function(){ 
     console.log(i); 
    }, 1000*(i+1));}(i)); 
} 
+0

雖然這解決了即時問題,但OP會爲每個超時輸出'4'。我知道這不是問的問題,但你可能會爲本壘打拍攝:) – Andy

+0

@安迪,你是對的,讓我更新答案... –

+0

這幫了很多。謝謝。 – Marc

0

基於Jordão酒店的答案,我結束了使用下面的代碼:

for(var i = 0; i <=3; i++){ 
    (function(){ 
     var j = i; 
     setTimeout(function(){ 
     console.log(j); 
     }, 1000); 
    }()); 
} 
0

所以,你知道的未來,你可以得到你的輸出,如果你使用的代碼行的小(清潔?)號遞歸:

function loop(i) { 
    console.log(i = i || 0); 
    if (i <= 3) setTimeout(loop, 1000, ++i); 
} 

loop(); 

DEMO