邏輯理解:當程序執行setTimeout()和setInterval()時,會讓這兩者到后台(我的理解,事實是否如此,有待驗證)運行計時,當時間到了之后,將回調函數按照順序依次排在當前正在執行的函數隊列尾部。哪怕延遲為0也一樣,當前正在執行解析的Javascript解析器並不會立即執行定時器的回調函數(定時器相當於異步,但有區別),還是會將它們的回調函數排在當前解析隊列的尾部(或者可以理解為放在下一輪函數隊列的頭部)。
區別理解:setTImeout()中的回調函數開始執行的延遲時間 >= delay,綜上所述,因為在delay過程中有時會有其他函數在執行,如果那些函數執行的時間大於delay的時間,就會導致setTImeout()中的回調函數“延期執行”。
setInterval()中的回調函數執行之間的間隔<= delay:我們都知道,setInterval()會按照固定的時間間隔調用自身的回調函數,且不會在意上一次的回調函數是否執行完畢,這就意味着,如果上一次回調函數前面有等待執行的函數,它們總體執行的時間>delay的時間且當前將要執行的回調函數與上一次的回調函數之間沒有其他等待執行的函數,就會導致一種情況:setTImeout()中的回調函數會連續執行兩次。
如:
setTimeout(function() { // 此回調函數每次執行的間隔時間 >= 100
/*
一堆函數體
*/
setTimeout(arguments.callee, 100)
}, 100)
setInterval(function () { // 此回調函數每次執行的間隔時間 <= 100
/*
一堆函數體
*/
}, 100)