setTimeout()、setInterval()和requestAnimationFrame(),这三个与定时有关的方法都属于浏览器的window对象的方法,
1. setTimeout() 超时执行时
2. setInterval() 周期执行
3. requestAnimationFrame(fun) 根据浏览器屏幕刷新频率执行回调函数
回调函数执行次数通常是每秒 60 次,但在大多数遵循 W3C 建议的浏览器中,回调函数执行次数通常与浏览器屏幕刷新次数相匹配。该回调函数会传入 DOMHighResTimeStamp 参数,它表示requestAnimationFrame() 开始执行回调函数的时刻。可使用 cancelAnimationFrame() 来取消requestAnimationFrame()对某个函数的引用。
4. 差异
setTimeout() 定时完成之后就会被释放;
setInterval() 会一直周期执行,需要进行手动释放;
requestAnimationFrame() 函数的定时根据浏览器的屏幕刷新频率来定,而且当 **当 requestAnimationFrame() 运行在后台标签页或者隐藏的 里时,requestAnimationFrame() 会被暂停调用以提升性能和电池寿命。
5. 共性
都可以理解为定时函数,但是是由于 JavaScript 其实是运行在单线程环境中的,这就意味着定时器仅仅是计划代码在未来的某个时间执行,而具体执行时机是不能保证的,需要根据占用浏览器资源的事件来决定定时是否被推迟。