Debounce и Throttle в JavaScript: один сниппет — две техники

Когда ты ловишь события вроде scroll, resize, input, важно не перегружать браузер. Для этого существуют две техники:
debounce (отложить выполнение) и throttle (ограничить частоту вызовов).
function throttleDebounce(fn, delay, mode = 'throttle') {
  let lastCall = 0;
  let timeout;

  return function (...args) {
    const now = Date.now();

    if (mode === 'debounce') {
      clearTimeout(timeout);
      timeout = setTimeout(() => fn.apply(this, args), delay);
    } else {
      if (now - lastCall >= delay) {
        lastCall = now;
        fn.apply(this, args);
      }
    }
  };
}

// Использование:
// Debounce (например, поиск по инпуту)
input.addEventListener('input', throttleDebounce(handleInput, 300, 'debounce'));

// Throttle (например, scroll)
window.addEventListener('scroll', throttleDebounce(trackScroll, 200, 'throttle'));