對于函數:function startMove(){div1.style.left=div1.offsetLeft+20+"px";setTimeout('startMove()',300);}請問:setTimeout是在上一個回調函數執行結束后,等指定的delay秒后再執行,還是上一個回調函數開始執行后(不管有沒有執行完)就立即等delay秒后執行,還是上一個回調函數開始執行后(不管有沒有執行完)就立即等delay秒,如果此刻上一個回調函數執行完了,就立即執行(等待時間恰好是delay秒),否則等上一個回調函數執行完,再執行,此時等的時間已經大于delay秒了。
2 回答

手掌心
TA貢獻1942條經驗 獲得超3個贊
都是等待執行完畢后執行的,可以嘗試跑這段代碼:
123 | setInterval ( function () { alert( '每次同時只會出現一個' ); }, 3000); |
setTimeout 這個函數是在延時后執行 1 次。而 setInterval 是一直延時、執行重復。

犯罪嫌疑人X
TA貢獻2080條經驗 獲得超4個贊
setTimeout是在上一個回調函數執行結束后,等指定的delay秒后再執行,setInterval是上一個回調函數開始執行后(不管有沒有執行完)就立即等delay秒后執行
然而
我們對JavaScript定時器存在一個誤解,JavaScript其實是運行在單線程的環境中的,這就意味著定時器僅僅是計劃代碼在未來的某個時間執行,而具體執行時機是不能保證的,因為頁面的生命周期中,不同時間可能有其他代碼在控制JavaScript進程。在頁面下載完成后代碼的運行、事件處理程序、Ajax回調函數都是使用同樣的線程,實際上瀏覽器負責進行排序,指派某段程序在某個時間點運行的優先級。
我們可以可以把JavaScript想象成在時間線上運行。當頁面載入的時候首先執行的是頁面生命周期后面要用的方法和變量聲明和數據處理,在這之后JavaScript進程將等待更多代碼執行。當進程空閑的時候,下一段代碼會被觸發
除了主JavaScript進程外,還需要一個在進程下一次空閑時執行的代碼隊列。隨著頁面生命周期推移,代碼會按照執行順序添加入隊列,例如當按鈕被按下的時候他的事件處理程序會被添加到隊列中,并在下一個可能時間內執行。
- 2 回答
- 0 關注
- 653 瀏覽
添加回答
舉報
0/150
提交
取消