簡體   English   中英

立即調用setTimeOut表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM