2015-12-21 49 views
4

我碰到一個片段來這樣這是因爲Javascript beign單線程嗎?

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

我預期登錄1,2 ....相反,它記錄3.不知道這是因爲JS beign單線程的,&看着隊列後,才完成循環。

WORKING COPY

+1

是的,這是一個清晰的思路。你在問如何避免這種情況,或者你是否只是尋求觀察到的行爲的確認? –

+3

您的超時功能在您的循環完成後執行。當時你的'i'等於3,這就是它總是記錄3。 –

+0

甚至(特別是)如果JS是多線程的 - 這個解決方案不能保證連續返回'1,2,3'。 – zerkms

回答

8

這是因爲在JavaScript的方式async執行。當執行console.log(i)時,for loop完成其迭代,並且由於JavaScript沒有塊級作用域,所以在所有迭代中,i的值console.log(i)變爲3

一種用於此解決辦法是使用IIFE並傳遞i入範圍:

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

 
    })(i); 
 
}

Read More about IIFE

0

這是因爲到的setTimeout()的調用函數將初始化定時器所以一旦定時器設置完成後,其餘的語句將被執行。一旦當前的執行堆棧完成,定時器的調用就會發生。

你可以從this video from a JSConf它是如何發生的

相關問題