我在 MDN 上遇到过这个例子,它使用 requestAnimationFrame 而不是 setTimeout :

// Reference: http://www.html5rocks.com/en/tutorials/speed/animations/

var last_known_scroll_position = 0;
var ticking = false;

function doSomething(scroll_pos) {
  // do something with the scroll position
}

window.addEventListener('scroll', function(e) {
  last_known_scroll_position = window.scrollY;
  if (!ticking) {
    window.requestAnimationFrame(function() {
      doSomething(last_known_scroll_position);
      ticking = false;
    });
  }
  ticking = true;
});

这让我开始思考我们是否可以使用 requestAnimationFrame 而不是 setTimeout(fn, 0),这是否有任何优势?我用谷歌搜索了一下,似乎所有的比较都是在动画的上下文中完成的,但是不相关的功能呢——比如去抖动/节流,或者只是如果你需要在重绘后运行代码?

最佳答案

RequestAnimationFrame 很好,如果你想确保你不做不必要的工作,因为你在 2 帧更新之间更改了两次。

requestAnimationFrame 本身对于动画以外的任何东西都没有用,因为它只能等待 16.666 毫秒(如果没有延迟),因此您需要将多个链接在一起。但是,如果您将它与 setTimeout 配对,那么您将能够等待特定的毫秒数,并确保在正确的时间绘制所有内容。

关于javascript - 使用 requestAnimationFrame 而不是 setTimeout 进行去抖动/节流有什么好处,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40277945/

10-12 00:53