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