[英]Immediately-Invoked setTimeOut expression
在下面的代碼中,我使用IIFE在循環的當前迭代期間立即執行關閉。
for(var i = 0; i < 3; i++) {
console.log('Im in counter ' + i);
(function() {
var num = i;
setTimeout(function() {
console.log(num);
},0);
})();
};
上面的代碼將輸出打印如下:
我在櫃台0
我在櫃台1
我在櫃台2
0
1
2
如果在當前迭代中立即調用該閉包,則以下輸出將是預期的結果,而不是上面給出的實際輸出。 誰能解釋forFE循環中IIFE異常行為的原因?
我在櫃台0
0
我在櫃台1
1
我在櫃台2
2
將函數傳遞給setTimeout
會將其放入隊列。 在以下情況下將觸發:
這樣就進入了循環。 記錄值。 將一個函數放在setTimeout隊列上。 然后重復。
最終,您到達循環的盡頭。 功能結束。 因此,計時器很快就會用完,並且setTimeout函數將執行。 下一個呢。 等等。
下面的答案是正確的。 setTimeout函數可立即執行(您可以通過編寫setTimeout的返回值來驗證此結果,setTimeout是計時器的標識符)。 無需使用循環,只需在每次傳遞給setTimeout的函數執行時驗證該值即可。 看一下這段代碼:
var num = 3;
function a(x) {
setTimeout(function c() {
console.log(x);
x++;
if (x<= num) a(x);
},1000);
}
a(0);
調用a的初始值為0。這將設置一個超時來記錄該值。 在該函數中,如果數字小於num變量,它將再次調用自身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.