Реализуй функцию debounce — декоратор, возвращающий функцию, которая при нескольких вызовах подряд выполняет только последний вызов после заданной задержки.

Функция debounce нужна для того, чтобы ограничить частоту вызова переданной функции func.

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

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

Функция debounce нужна для того, чтобы ограничить частоту вызова переданной функции func. В этом случае, debouncedIncrement должна вызывать increment не чаще, чем раз в 100 мс, и при множественных вызовах подряд — выполнить increment только один раз после того, как вызовы прекратятся на 100 мс.

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

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

Функция debounce нужна для того, чтобы ограничить частоту вызова переданной функции func. В этом случае, debouncedIncrement должна вызывать increment не чаще, чем раз в 100 мс, и при множественных вызовах подряд — выполнить increment только один раз после того, как вызовы прекратятся на 100 мс.

Реализация debounce может выглядеть так:

function debounce(func, wait = 0) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, wait);
  };
}

Объяснение:

  • При каждом вызове возвращённой функции очищается предыдущий таймаут.
  • Новый таймаут запускается на wait миллисекунд.
  • Если вызовы идут подряд быстрее, чем wait, функция func не вызывается.
  • Как только вызовы прекращаются на wait мс, вызывается func один раз.

В твоём примере:

  • Первые несколько вызовов debouncedIncrement() идут подряд и не вызывают increment сразу.
  • После паузы в 100 мс вызывается increment и увеличивает i.
  • Таймауты с задержкой 150, 200 и 350 мс демонстрируют, что вызовы, близкие по времени, объединяются, а вызовы с задержкой вызывают increment отдельно.

Это классическая реализация debounce для контроля частоты вызовов функций, например, при обработке событий ввода или прокрутки.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку