簡體   English   中英

何時調用 setTimeout 注冊的 function?

[英]When is the function registered with setTimeout called?

它可能在執行“一些”正常代碼后調用? 但我不確定......如果有一種足以描述 javascript 代碼如何在瀏覽器中執行的大圖,那就太好了。

大多數時候瀏覽器執行線程是空閑的,沒有運行任何代碼。 當您注冊一些 function 以使用setTimeout執行時,它將不早於給定的毫秒數之后執行。

現在:如果在給定時間后執行其他代碼(如事件處理程序或長循環),瀏覽器工作線程正忙,您的 function 將不得不等待。 考慮這段代碼:

setTimeout(f, 500);
for(var i = 0; i < 10000000; ++i){
    //...
}

setTimeout立即返回,允許執行循環。 如果這個循環運行超過 500 毫秒,它不會被中斷,你的f function 將不得不等待。 如果在例如 490 毫秒后觸發一些冗長的事件處理程序,也會發生同樣的事情。

將瀏覽器 JS 工作線程視為具有單個消費者和多個生產者的隊列。 隊列中的一些項目可以立即被拾取(如事件處理程序),一些必須等到它們的超時到期。

Javascript 是單線程的,使用調用堆棧運行,本質上是先到先服務處理。

setInterval 和 setTimeout 函數在提供的持續時間過去后將傳遞的 function 放入調用堆棧。 這里的區別是結果當時沒有執行,它們只是放入調用堆棧,所以如果某些東西已經在運行,它不會執行你在超時中提供的 function 直到你完成。

例如:

var i = 0;
setTimeout(function() { i = 1; }, 10);
for (; i < 1;) {}

即使在 10 毫秒后,將 i 設置為 1 的 function 被調用,你也永遠不會擺脫那個 for 循環,它只在調用堆棧上,並且在 for 循環完成之前不會生效。

也許我不理解這個問題..但這直接取自window規范。

setTimeout(function, milliseconds) 此方法在指定的毫秒數過去后調用一次 function,直到通過調用 clearTimeout 取消。 這些方法返回一個 timerID,可以在隨后的 clearTimeout 調用中使用它來取消間隔。

參考

基本上 function 在您指定的毫秒數過去后立即調用。

暫無
暫無

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

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