Реализация функции дебаунса

Замкните ID таймера, отменяйте его при новом вызове и вызывайте функцию только после паузы. Используйте обычную функцию для обёртки, чтобы сохранить this.

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

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

Замкните ID таймера, отменяйте его при новом вызове и вызывайте функцию только после паузы. Используйте обычную функцию для обёртки, чтобы сохранить this.

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

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

Условие

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

Ответ

Замкните ID таймера, отменяйте его при новом вызове и вызывайте функцию только после паузы. Используйте обычную функцию для обёртки, чтобы сохранить this.

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

Это trailing debounce: первый вызов тоже откладывается. Аргументы и контекст берутся из последнего обращения. В отличие от throttle, постоянный поток событий способен откладывать выполнение бесконечно. При использовании в компоненте добавьте метод cancel для очистки таймера при уходе со страницы.

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

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

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

Подробнее