https://stackoverflow.com/questions/17926327/why-requestanimationframe-recursion-wont-eat-up-ram
function

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,
该回调函数会在浏览器下一次重绘之前执行

Here's the MDN's example:

function step(timestamp) {
  var progress = timestamp - start;
  d.style.left = Math.min(progress/10, 200) + "px";
  if (progress < 2000) {
    requestAnimationFrame(step);
  }
}

requestAnimationFrame(step);

Why "requestAnimationFrame" recursion won't eat up RAM?

stackoverflow上面有人说这个不是递归,但是自己栈就没有出来过,其实就是递归,自己尝试了类似的函数调用的方法,直接显示栈溢出,这种调用方式就是递归或者基本一致,而js里面调用requestAnimationFrame可行是因为浏览器进行了处理,正如作用一样,这个函数用来请求刷新前执行的,因为浏览器自己有一个刷新的帧,我们直接通过requestAnimationFrame递归来就可以不用setInterval了,更加节省CPU/GPU...资源