window.requestAnimationFrame()

请求动画
参数为回调函数
返回一个请求动画的id,可以使用这个id取消请求动画

cancelAnimationFram()

停止动画的执行
参数为 requestAnimationFrame返回的id,

requestAnimationFrame与setInterval/setTimeout的区别

setInterval/setTimeout的执行动画,会等到执行栈为空时,才回执行动画,这就是导致一规定时间执行动画会有误差,
这是因为setInterval/setTimeout是异步执行, 会吧执行动画的函数交给时间线程,到达时间规定值后会添加进事件队列中的宏队列,被添加进事件队列的函数会等到执行栈为空时,执行栈才会依次执行事件对列的函数。这就导致每次执行动画的间隔不好确定。
而requestAnimationFrame会跟随浏览器重绘频率,浏览器的重绘的频率一般会和显示器的刷新频率保持同步,比如显示器的屏幕刷新率为60Hz,使用requestAnimationFrame API,那么回调函数就每1000ms / 60 ≈ 16.7ms执行一次,requestAnimationFrame 会把每一帧中的所有 DOM 操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率。

重复绘制

多次调用带有同一回调函数的 requestAnimationFrame,会导致回调在同一帧中执行多次,也就是说它并不管理回调函数。可能会有性能问题。但我们也可以利用它,比如写一个旋转速度随着点击次数增加的代码。每次增加的deg都是1,但是在一帧执行多个回调函数,即绘制了多次动画,旋转越来越快,这说明它不管理回调函数,这就需要节流函数。