setInterval 的作用是每隔一段指定時間執行一個函數,但是這個執行不是真的到了時間立即執行,它真正的作用是每隔一段時間將事件加入事件隊列中去,只有當當前的執行棧為空的時候,才能去從事件隊列中取出事件執行。所以可能會出現這樣的情況,就是當前執行棧執行的時間很長,導致事件隊列里邊積累多個定時器加入的事件,當執行棧結束的時候,這些事件會依次執行,因此就不能到間隔一段時間執行的效果。
針對 setInterval 的這個缺點,我們可以使用 setTimeout 遞歸調用來模擬 setInterval,這樣我們就確保了只有一個事件結束了,我們才會觸發下一個定時器事件,這樣解決了 setInterval 的問題。
實現思路是使用遞歸函數,不斷地去執行 setTimeout 從而達到 setInterval 的效果