В чем разница между requestAnimationFrame и setTimeout в стеке задач

«В чем разница между requestAnimationFrame и setTimeout в стеке задач» — вопрос из категории Асинхронность, который задают на 10% собеседований Frontend Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

requestAnimationFrame и setTimeout работают в разных частях цикла событий:

  1. requestAnimationFrame:
    • Вызывается перед ререндерингом страницы (в фазе BeforePaint).
    • Оптимизирован для анимаций, синхронизируется с частотой обновления экрана (обычно 60fps).
    • Браузер может объединять вызовы или пропускать кадры для оптимизации.
function animate() {
  element.style.left = `${pos++}px`;
  requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
  1. setTimeout:
    • Попадает в общую очередь макрозадач.
    • Нет гарантии точного времени выполнения (может задерживаться из-за других задач).
    • Минимальная задержка ≈4мс в современных браузерах.
function move() {
  element.style.left = `${pos++}px`;
  setTimeout(move, 16); // ~60fps
}
setTimeout(move, 16);

Ключевое отличие: rAF - для визуальных изменений, setTimeout - для общего отложенного кода. Браузер может приостановить rAF при скрытой вкладке.