Как debounce сохраняет this при отложенном вызове

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

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

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

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

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

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

Условие

Метод user.fetchUrl читает this.url. Нужен debounce, вызывающий метод с получателем последнего вызова и последними аргументами. Реализуйте обёртку.

Ответ

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

Пример:

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

Вызов должен остаться user.fetchUrl(). Извлечение обёртки без bind снова потеряет получателя: debounce не угадывает владельца объекта.

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

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

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

Подробнее