如何实现setTimeout和setInterval
Posted 幸福是奋斗出来的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现setTimeout和setInterval相关的知识,希望对你有一定的参考价值。
首先在针对浏览器端的默认实现中,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)
以上是关于如何实现setTimeout和setInterval的主要内容,如果未能解决你的问题,请参考以下文章