關(guān)于 setTimeout 延時執(zhí)行時機不準確的問題
老師,我對 `setTimeout` 的執(zhí)行時機不精確的原因理解,不知道正不正確:
1. 瀏覽器執(zhí)行 JS 是基于事件循環(huán)的,我假設(shè)每執(zhí)行一次 tick 的間隔是 17ms,我定義了一個延時函數(shù)在 18 ms 后進行。假設(shè)第一個 tick 瞬間完成,那么完成瞬間的時間戳是 0,等待 17ms 后執(zhí)行第二次 tick,此時發(fā)現(xiàn)那個延時函數(shù)還沒到時,所以不執(zhí)行,于是等下一次 tick 也就是 34 ms 時才執(zhí)行,所以導(dǎo)致時機不準確。
2. 每一次 tick 執(zhí)行的時間不固定。就基于剛說的第一點,延時函數(shù)在第三個 tick 進行,但是由于是異步的,所以在同步代碼執(zhí)行完才執(zhí)行,假設(shè)第三次 tick 的同步代碼執(zhí)行時間較長,于是這個函數(shù)的執(zhí)行時機又延長了。
那這,`setTimeout` 真正執(zhí)行的時機只會往后不會往前。不知道我說的對不對,請老師更正或補充一下。
2019-05-20
setTimeout執(zhí)行不精確,就JS講的話,就是異步機制的問題,它是到了那個時間將異步任務(wù)添加到執(zhí)行隊列里面去,不代表到了那個時間就執(zhí)行異步任務(wù)。和這個項目本身沒什么關(guān)系。