Функция debounce для отложенного вызова

При каждом вызове очищайте предыдущий таймер и создавайте новый. Сохраняйте this и последние аргументы, чтобы обёртка не меняла способ вызова функции.

Короткий ответ

Что ответить на собеседовании

При каждом вызове очищайте предыдущий таймер и создавайте новый. Сохраняйте this и последние аргументы, чтобы обёртка не меняла способ вызова функции.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо создать функцию debounce, принимающую на вход целевую функцию fn и длительность задержки timeout (в миллисекундах). Функция должна возвращать новую обёртку, которая будет вызывать fn только после того, как с момента последнего обращения к ней пройдет указанный интервал. Если обёртка вызывается повторно до истечения тайм‑аута, текущий таймер отменяется и запускается заново.

function debounce(fn, timeout) {
    // Реализация
}

const fn = debounce(() => console.log('fn'), 300);
fn();
fn();
fn();
// Ожидаемый вывод: 'fn' (один раз через 300 мс после последнего вызова)

Ответ

При каждом вызове очищайте предыдущий таймер и создавайте новый. Сохраняйте this и последние аргументы, чтобы обёртка не меняла способ вызова функции.

function debounce(fn, timeout) {
  let timer;
  function wrapped(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      timer = undefined;
      fn.apply(this, args);
    }, timeout);
  }
  wrapped.cancel = () => { clearTimeout(timer); timer = undefined; };
  return wrapped;
}

Это trailing-вариант: выполнение происходит после паузы, а не при первом обращении. Обёртка не возвращает синхронно результат fn. Три быстрых вызова создадут одно фактическое выполнение; при размонтировании компонента можно вызвать cancel().

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее