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