setTimeout 不是核心 JavaScript 的一部分。是的,你沒聽錯。它是瀏覽器(在 Web 環境中)提供的 Web API 或伺服器端環境中的 Node.js API 的一部分。
眾所周知,setTimeout方法以CB函數作為參數。另一個參數是必須執行 CB 的時間(以毫秒為單位)。
但是等等,setTimeout 不一定總是在給定的時間參數執行。如果我們的呼叫堆疊或主執行緒被任何程式碼區塊阻塞,則在阻塞程式碼完成後,setTimeout 會立即在呼叫堆疊中執行。在此之前,它仍然儲存在瀏覽器回調佇列或任務佇列中。
console.log("HELLO"); setTimeout(() => console.log("Timeout executed"), 5000); //should be execute after 5sec let start = new Date().getTime(); let end= start; while (end < start + 10000){ end= new Date.getTime(); } //This loop will block the main thread for 10sec console.log("Time Expire"); //output--- //HELLO //Time Expire //Timeout executed (Immediately just after Time expire)
還有一種情況,如果我們在setTimeout中提供0ms的時間會怎麼樣。是否像正常程式碼執行一樣依序執行。
答案是否定的,因為 setTimeout 首先進入 CB 佇列,不像其他函數先在呼叫堆疊中立即執行。
以上是setTimeout() 花費的時間比參數給定的時間長的詳細內容。更多資訊請關注PHP中文網其他相關文章!