自己实现一个高性能的setTimeout和setInterval函数
浏览器默认提供的setTimeout和setInterval的问题
首先在针对浏览器端的默认实现中,setTimeout和setInterval的定时是不准确的,因为我们知道js是单线程的,如果前面的代码耗费了较长的时间,那么会导致后面的定时器不能按时执行。此外setInterval会带来性能上的问题,比如存在执行累积的问题等等。
我们完全可以使用requestAnimationFrame
来实现定时器的要求,首先 requestAnimationFrame
自带函数节流功能,基本可以保证在 16.6 毫秒内只执行一次(不掉帧的情况下),并且该函数的延时效果是精确的,没有其他定时器时间不准的问题。
requestAnimationFrame简单介绍
requestAnimationFrame
的语法很简单:
window.requestAnimationFrame(callback);
callback为一个指定函数的参数,该函数在下次重新绘制动画时调用
重新绘制的时间即16.6毫秒执行。我们可以通过递归调用来达到定时器的效果
setTimeout的实现
function mySetTimeout(callback, timeout) {
let timer
let startTime = Date.now()
const loop = () &#