老师,我对 `setTimeout` 的执行时机不精确的原因理解,不知道正不正确:
1. 浏览器执行 JS 是基于事件循环的,我假设每执行一次 tick 的间隔是 17ms,我定义了一个延时函数在 18 ms 后进行。假设第一个 tick 瞬间完成,那么完成瞬间的时间戳是 0,等待 17ms 后执行第二次 tick,此时发现那个延时函数还没到时,所以不执行,于是等下一次 tick 也就是 34 ms 时才执行,所以导致时机不准确。
2. 每一次 tick 执行的时间不固定。就基于刚说的第一点,延时函数在第三个 tick 进行,但是由于是异步的,所以在同步代码执行完才执行,假设第三次 tick 的同步代码执行时间较长,于是这个函数的执行时机又延长了。
那这,`setTimeout` 真正执行的时机只会往后不会往前。不知道我说的对不对,请老师更正或补充一下。
setTimeout执行不精确,就JS讲的话,就是异步机制的问题,它是到了那个时间将异步任务添加到执行队列里面去,不代表到了那个时间就执行异步任务。和这个项目本身没什么关系。