window.requestAnimationFrame || 
window.webkitRequestAnimationFrame || 
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame || 
window.msRequestAnimationFrame || 
function (func) {
    setTimeout(func, 1000 / 40);
}

requestAnimationFrame的使用

(function animloop(time) {
      console.log(time,Date.now())
      render();
      rafId = requestAnimationFrame(animloop);
      //如果left等于50 停止动画
      if(left == 50){
          cancelAnimationFrame(rafId)
      }
})();
//requestAnimationFrame()返回一个 long 整数,请求 ID ,是回调列表中唯一的标识,是个非零值,没别的意义。你可以传这个值给 window.cancelAnimationFrame() 以取消回调函数。
window.cancelAnimationFrame();//取消调用执行

通过观察可以看出来,我们上面的这段代码的目的是为了让我们可以,实现定时渲染
总结:
浏览器其实一直在刷新,当给window.requestAnimationFrame传入一个回调函数的时候,那么就是告诉浏览器在渲染前执行一下这个回调函数。