Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: debounce, timer, clearTimeout, event loop, JavaScript

Почему при реализации debounce необходимо очищать предыдущий таймер?

Вопрос проверяет понимание механизма работы debounce и необходимости сброса предыдущего таймера для корректной задержки выполнения функции.

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

Debounce откладывает выполнение функции до тех пор, пока не пройдет определенный интервал времени после последнего вызова. Очистка предыдущего таймера необходима, чтобы отменить уже запланированный вызов и запустить новый отсчет. Без этого каждый вызов будет создавать новый таймер, и функция выполнится несколько раз, а не один раз после прекращения активности.

Длинный ответ

Что такое debounce и зачем нужна очистка таймера?

Debounce — это техника, которая гарантирует, что функция будет вызвана только после того, как пройдет определенный промежуток времени с момента последнего события. Это особенно полезно для обработки частых событий, таких как ввод текста, изменение размера окна или скроллинг.

Ключевой момент реализации — использование таймера (например, setTimeout), который откладывает выполнение функции. При каждом новом вызове debounce-функции необходимо очистить предыдущий таймер с помощью clearTimeout. Если этого не сделать, то каждый вызов будет создавать новый таймер, не отменяя старые. В результате функция выполнится несколько раз — по одному разу для каждого вызова, что полностью нивелирует смысл debounce.

Пример реализации

function debounce(func, delay) {
  let timerId;
  return function(...args) {
    clearTimeout(timerId); // очищаем предыдущий таймер
    timerId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

// Использование
const handleInput = debounce((text) => {
  console.log('Отправка запроса:', text);
}, 300);

document.querySelector('input').addEventListener('input', (e) => {
  handleInput(e.target.value);
});

В этом примере при каждом вводе символа предыдущий таймер отменяется, и устанавливается новый. Только когда пользователь перестанет печатать на 300 мс, функция выполнится один раз.

Что будет без очистки?

Если убрать clearTimeout(timerId), то каждый вызов handleInput создаст новый таймер, не отменяя старые. Все эти таймеры сработают через 300 мс после своего создания, и функция выполнится столько раз, сколько было вызовов. Это приведет к множеству ненужных операций, например, к отправке нескольких запросов на сервер.

Вывод

Очистка предыдущего таймера — обязательная часть корректной реализации debounce. Она гарантирует, что выполнение функции откладывается до момента, когда поток событий прекратится, что позволяет избежать избыточных вычислений и сетевых запросов. Эта техника широко применяется в интерфейсах для оптимизации производительности и улучшения пользовательского опыта.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#debounce

#timer

#clearTimeout

#event loop

#JavaScript

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию