计时器能精确计时吗?
不能
- 硬件层面: 没有原子钟
- 系统层面: 浏览器调用的操作系统的计时函数,操作系统的计时函数本来就有误差(硬件节拍器只能在固定时间间隔检查时间,CPU的多任务抢占)
- 标准层面: w3c规定计时器嵌套超过五层的时候,从第六层开始最低计时就是4ms,不足4ms会被补到4ms
- 事件循环: 计时器的回调任务放在延时队列中,在计时器计时完成后他需要等主线程的同步任务做完,微队列任务做完,交互队列任务做完,这中间也是误差
替代品:
- requestAnimationFrame: 每次操作间隔为一帧,即每次在帧缓冲信号到来之前执行,但是如果当时的JS代码过于复杂可能导致掉帧,那会在下一帧帧执行这一次,即在下一帧先执行这一次的rAF,在执行下一帧本来的rAF,但是如果下一帧也掉帧了那就会继续往后堆积,但是由于都是在一个队列中所以顺序不会乱
- Date.now(): 自 1970-01-01 00:00:00 UTC 至今的毫秒数(Unix 时间戳),精度为毫秒级
- performance.now() : 从页面导航开始(
performance.timing.navigationStart)到当前时间的高精度毫秒数,通常为浮点数(微秒级精度)