setTimeout(), setInterval(), and requestAnimationFrame()

Why is requestAnimationFrame ideal for this scroll animation?
function smoothScroll(element, duration) {
  const start = element.scrollTop;
  const change = target - start;
  const startTime = performance.now();

  requestAnimationFrame(function animate(currentTime) {
    const elapsed = currentTime - startTime;
    const progress = Math.min(elapsed / duration, 1);
    
    element.scrollTop = start + change * easeInOutCubic(progress);
    
    if (progress < 1) requestAnimationFrame(animate);
  });
}
Next Question (20/20)