共计 1111 个字符,预计需要花费 3 分钟才能阅读完成。
首先在针对浏览器端的默认实现中,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) |
正文完
发表至: javascript
2021-06-30