Выбор ответа Junior Реализация с нуля обновлено

debounce без clearTimeout

Вопрос

Обработчик ввода обёрнут в эту функцию. Пользователь быстро набрал 5 символов. Сколько раз вызовется fn?

function debounce(fn, ms) {
  return function (...args) {
    setTimeout(() => fn.apply(this, args), ms);
  };
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: 5 раз, каждый с задержкой ms после своего символа. Без сохранения и сброса таймера это не debounce, а просто отложенный вызов: каждый ввод ставит свой таймер, и все пять сработают.

Варианты ответа

  1. 1 раз, через ms после последнего символа
  2. 5 раз, каждый с задержкой ms после своего символаправильный ответ
  3. 0 раз: каждый новый вызов отменяет предыдущий
  4. 1 раз, через ms после первого символа

Разбор

Без сохранения и сброса таймера это не debounce, а просто отложенный вызов: каждый ввод ставит свой таймер, и все пять сработают. Суть debounce в том, что новый вызов отменяет предыдущий таймер (clearTimeout(timer)), поэтому для корректной реализации нужна переменная timer в замыкании. Вызов через ms после первого символа это поведение throttle с leading-режимом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.