我對 setTimeOut 的作業方式有點困惑:為什么回呼函式在呼叫時沒有得到它需要的值,而是從腳本的底部得到它們?
我希望它列印 5 而不是 7..
我錯過了什么?
任何幫助表示贊賞,謝謝!
let foo = () => {
console.log(x);
};
let x = 5;
setTimeout(foo, 0); //7
for (let i = 0; i < 10000000000; i ) {} //just to waste some time because the timeOut is actually 4ms
x = 7;
uj5u.com熱心網友回復:
回呼函式setTimeout不執行,直到該呼叫堆疊是空的,并呼叫堆疊不會是空的,直到你同步JavaScript代碼完成的執行。
由于最后一條陳述句覆寫了 的值x,因此在setTimeout呼叫的回呼函式時,會記錄最新的值,即 7。
似乎您希望在回圈setTimeout執行時執行回呼函式,for但這不是 Javascript 的作業方式。
一旦定時器超時,則將 的setTimeout回呼函式setTimeout入隊到任務佇列中。從任務佇列中,事件回圈會將這個回呼推送到呼叫堆疊上,但回呼函式不會被推送到呼叫堆疊上,直到沒有其他 javascript 代碼正在執行,即呼叫堆疊為空。
同步腳本執行結束需要多長時間并不重要;在同步腳本執行結束之前,不會執行任何預定的回呼。
請記住,您的所有代碼都在單個執行緒上執行。
另外請注意,傳遞到毫秒數setTimeout是不是之后,回呼函式將被執行的準確時間; 這是呼叫回呼函式的最短時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/365101.html
標籤:javascript 功能 设置超时
上一篇:如何檢查MutableList的元素或String輸入是數字?
下一篇:檢查連續零的字串
