我碰到一個片段來這樣這是因爲Javascript beign單線程嗎?
(function(){
for(var i=0;i<3;i++){
setTimeout(function(){
console.log(i)
})
}
}())
我預期登錄1,2 ....相反,它記錄3.不知道這是因爲JS beign單線程的,&看着隊列後,才完成循環。
我碰到一個片段來這樣這是因爲Javascript beign單線程嗎?
(function(){
for(var i=0;i<3;i++){
setTimeout(function(){
console.log(i)
})
}
}())
我預期登錄1,2 ....相反,它記錄3.不知道這是因爲JS beign單線程的,&看着隊列後,才完成循環。
這是因爲在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);
}
這是因爲到的setTimeout()的調用函數將初始化定時器所以一旦定時器設置完成後,其餘的語句將被執行。一旦當前的執行堆棧完成,定時器的調用就會發生。
你可以從this video from a JSConf它是如何發生的
是的,這是一個清晰的思路。你在問如何避免這種情況,或者你是否只是尋求觀察到的行爲的確認? –
您的超時功能在您的循環完成後執行。當時你的'i'等於3,這就是它總是記錄3。 –
甚至(特別是)如果JS是多線程的 - 這個解決方案不能保證連續返回'1,2,3'。 – zerkms