簡體   English   中英

即使使用setTimeout,循環也總是結束

[英]Loop always finishes, even with setTimeout

我正在運行一些JavaScript代碼來測試/理解setTimeOut的行為。

我使用以下代碼:

var timerx1 ;

if (timerx1) window.clearTimeout(timerx1);
timerx1 = setTimeout(testme, 10);

調用此函數:

function testme() {
    for (var c = 0; c < 900000; c++) {
        document.getElementById("divMode").innerHTML = c;
    } 
}

該循環將始終在退出之前完成。

我曾期望setTimeOut為10ms會“踢”進去,並且循環在完成之前會中止。

我強調這不是任何其他代碼或應用程序的一部分。 我只是想了解setTiemOut的工作原理和任何限制。

setTimeout不會中斷或“超時”循環:它只是在經過了很多時間后才調用回調函數。

在指定的延遲后調用函數或執行代碼段。

setTimeout等待指定的毫秒數並執行函數。在您的示例中,您等待10ms

Javascript在堆棧上運行任務。 您的for循環完全作為這些循環之一執行。 當您使用setTimeout它將采用您傳入的函數並將其附加到該任務堆棧的末尾。 然后它將在適當的時候執行該任務。

                              // current thread  | waiting
doSomething();                //   execute now   |    --
setTimeout(doSomething, 10);  // append to stack | doSomething (8ms left)
doSomethingElse();            //   execute now   | doSomething (5ms left)
// End of current thread      //      --         | doSomething (0ms left) do this next
                              //    doSomething  |    --

SetTimeout立即返回,就好像它完成了一樣。 它基本上分配功能掛起狀態和當前線程完成之后將被執行(上方/返回當前函數) 超時定時器結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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