Привяжите исходную обычную функцию к user до передачи в debounce: debounce(function () { console.log(this.firstName); }.bind(user), 200). Сам debounce изменять не нужно.
Как сохранить this.firstName в debounced-вызове?
Привяжите исходную обычную функцию к user до передачи в debounce: debounce(function () { console.log(this.firstName); }.bind(user), 200). Сам debounce изменять не нужно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дана неизменяемая функция debounce(fn, ms), возвращающая обычную функцию: она сбрасывает предыдущий таймер и вызывает fn(...args) после паузы без сохранения this. Есть user = {firstName:'Ира'}. Нужно один раз создать debounced-обработчик, который печатает имя user даже при отделённом вызове.
Ответ
Привяжите исходную обычную функцию к user до передачи в debounce: debounce(function () { console.log(this.firstName); }.bind(user), 200). Сам debounce изменять не нужно.
Альтернатива для фиксированного объекта — стрелка debounce(() => console.log(user.firstName), 200): она явно читает user, а не пытается получить this от таймера. Создавайте обёртку один раз, иначе у каждого вызова будет независимый таймер и подавление серии не сработает. Если требуется динамический получатель каждого вызова, контракт debounce уже должен сохранять this отдельно.