Отложенный вызов (debounce)

Medium
FunctionTimingYandexTinkoff

Реализуйте функцию debounce(fn, ms), которая возвращает «debounced»-версию fn.

Debounced-функция откладывает вызов fn на ms миллисекунд после последнего вызова. Если за это время происходит ещё один вызов, таймер сбрасывается.

const log = debounce(console.log, 300);
log('a'); // таймер 300ms
log('b'); // сброс, таймер 300ms
// через 300ms: console.log('b')

После реализации могут спросить:

  • Чем отличается от throttle?
  • Как добавить опцию immediate — вызов в начале, а не в конце?
  • Где в реальном проекте используется debounce?
Подсказка

Таймер хранится в замыкании — одна переменная timerId на все вызовы обёртки. Каждый новый вызов делает clearTimeout и ставит новый таймер.

Подсказка

Используйте fn.apply(this, args) вместо fn(...args) — это сохраняет контекст this, если debounce применяется к методу объекта.

Ваш код - JavaScript
Результаты
Нажмите «Запуск» для выполнения кода