Создание функции debounce с корректным отложенным вызовом

Исходная функция только создаёт таймер при каждом обращении и не является debounce. Нужна возвращаемая обёртка с общим ID таймера, который отменяется при повторном вызове.

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

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

Исходная функция только создаёт таймер при каждом обращении и не является debounce. Нужна возвращаемая обёртка с общим ID таймера, который отменяется при повторном вызове.

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

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

Условие

Необходимо реализовать функцию debounce, которая при множественных вызовах откладывает выполнение переданной функции до истечения заданного интервала, гарантируя, что callback будет выполнен только один раз после завершения тайм‑аута.

const debounce = (fn, delay) => setTimeout(() => {
  fn();
}, delay);

Ответ

Исходная функция только создаёт таймер при каждом обращении и не является debounce. Нужна возвращаемая обёртка с общим ID таймера, который отменяется при повторном вызове.

function debounce(fn, delay) {
  let timer;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => fn.apply(this, args), delay);
  };
}
const delayed = debounce(() => console.log('done'), 300);
delayed(); delayed(); delayed();

В примере будет один вызов после паузы. Создавайте обёртку один раз: повторный debounce(fn, delay) перед каждым событием создаст независимые таймеры и разрушит ограничение. Уже выполняющуюся функцию отменить очисткой таймера нельзя.

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

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

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

Подробнее