requestAnimationFrame与setInterval都可以实现循环触发事件,但是setInterval是基于时间的,而requestAnimationFrame是基于帧数的,在我的一次开发弹幕的项目中,在一开始使用了setInterval来切换弹幕的位置,起初并没有什么问题,但是当浏览器切换回后台后,就会出现弹幕积攒过多的原因,因为我随不断的创建新的弹幕进行移动(为了考虑性能,会优先使用已经被废弃的弹幕盒),当浏览器切换到后台后,浏览器本身已经不进行页面渲染了,而我的定时器却在不断的创建新的弹幕以用来发射,当用户将浏览器切换到前台时候,会看到在一段时间内积攒的弹幕堆积到一起,最后发现是因为 浏览器在后台的时候 定时器还是会不断的跑的,但是在当前这种情况下 我可能并不是很希望弹幕系统继续运行下去,我希望知道浏览器当前状态是在前台还是后台,如果是后台的话 则暂停弹幕,然而在微信中并没有看到相关的机制,后来看到了requestAnimationFrame,requestAnimationFrame也是不断的循环执行事件,但是他是按帧执行的,而且有一个好处是 当浏览器切换到后台后,requestAnimationFrame是不会再去执行事件了。这和setInterval有着本质的差异。而requestAnimationFrame之所以在浏览器进入后台不去执行的原因 ,应该是和浏览器进入后台后不去渲染界面有关,因为渲染界面后需要逐帧绘制,当不进行页面的选然后,也就没必要去执行帧操作了,所以requestAnimationFrame也不会去执行了
如果上述推论是正确的,那可以基此判断出setTimeout在浏览器进入后台后依然会运行,就像setInterval一样