定时器
setTimeout 机制
js 是单线程运行,setTimeout 只是负责准时把事件压入事件循环主任务队列末尾,在下一次事件循环开始时执行,并不是说时间到了就执行,还要等到线程空闲才能被执行,因此会产生误差
校正
无法完全避免,可通过一定办法减少误差
// 记录上次时间
let T0 = new Date();
function loop() {
// 记录代码执行消耗时间
let T1 = new Date();
// 获取下次执行时间间隔
let t = 1000 - T1 - T0;
// 赋值给 T0
T0 = T1;
setTimeout(loop, t);
}
setTimeout(loop, 1000);