首先在针对浏览器端的默认实现中,setTimeout和setInterval的定时是不精确的,因为咱们晓得js是单线程的,如果后面的代码消耗了较长的工夫,那么会导致前面的定时器不能按时执行。此外setInterval会带来性能上的问题,比方存在执行累积的问题等等。咱们齐全能够应用requestAnimationFrame来实现定时器的要求,首先 requestAnimationFrame 自带函数节流性能,根本能够保障在 16.6 毫秒内只执行一次
requestAnimationFrame的语法很简略:
1、requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就实现,并且重绘或回流的工夫距离紧紧追随浏览器的刷新频率,一般来说,这个频率为每秒60帧。
2、在暗藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量。
// setTimeout的实现function mySetTimeout(callback,timeout){ let timer; let time = new Date(); let endTime = timeout || 0 const loop = ()=> { timer = window.requestAnimationFrame(loop); if(new Date() - time >= endTime) { callback.call(this,timer); window.cancelAnimationFrame(timer); } } window.requestAnimationFrame(loop);}mySetTimeout(()=> { console.log('hh')})
function mySetInterval(callback,interval){ let timer; let startTime = new Date(); const loop = ()=> { timer = window.requestAnimationFrame(loop); if(new Date() - startTime >= interval) { callback.call(this,timer); startTime = new Date(); } } timer = window.requestAnimationFrame(loop); return timer;}var a = 1;mySetInterval(timer=> { a++; if(a >= 5){ window.cancelAnimationFrame(timer); } console.log(a,'1秒一次');},1000)