Возвращайте обычную функцию, сохраняющую this и аргументы текущего вызова. В таймере вызывайте исходную функцию через apply с сохранённым получателем.
Как debounce сохраняет this при отложенном вызове
Возвращайте обычную функцию, сохраняющую 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 не угадывает владельца объекта.