簡體   English   中英

setTimeout 是否被添加到調用堆棧中?

[英]Does setTimeout get added to the call stack?

我一直在學習setTimeout和同步與異步代碼,我正在觀看一個教程視頻,其中顯示了各種函數被調用並添加到調用堆棧,例如 function 簡單地添加 2 個數字。

然而,對於setTimeout ,他們沒有顯示當它被調用時它被添加到調用堆棧中,我知道這會觸發 web API 並且回調被添加到隊列中但我很好奇現在是否setTimeout正在被JS引擎執行,它是否被添加到調用堆棧中?

在 JS 引擎正在執行setTimeout的那一刻,它是否添加到調用堆棧中?

這是。 並且一旦回調被注冊,它就會從調用堆棧中彈出,所以這幾乎不需要任何時間。

當給定的延遲過去后,回調將排隊。 然后當調用棧為空時,JS 會處理事件隊列,並調用回調。 此回調也將添加到調用堆棧中。

只需要注意setTimeout和回調將不會被添加到調用堆棧中累積 保證在將回調推送到調用堆棧之前先清空調用堆棧。

是的,在 timeout 中設置的時間過后,回調將被推送到調用堆棧並執行。

實際上,JS 函數執行的唯一方式就是通過調用棧。

這是Philip Roberts 稱為 loupe 的一個很好的可視化工具,它可能有助於理解調用堆棧和與之相關的事物。

setTimeout 將被推送到調用堆棧,然后彈出。 當它彈出時,它被發送到瀏覽器 API(如果代碼在瀏覽器中執行)。 API 等待指定的時間完成並將回調發送到事件隊列。 當調用堆棧為空時,事件循環將從事件隊列中獲取回調(假設它在隊列中的下一個)並在執行時將其放入堆棧。

暫無
暫無

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

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