Передайте обёртку setTimeout(() => user.sayHi(), 100) или заранее привязанный метод setTimeout(user.sayHi.bind(user), 100). Простая передача user.sayHi теряет получателя user.
Как безопасно передать user.sayHi в setTimeout?
Передайте обёртку `setTimeout(() => user.sayHi(), 100)` или заранее привязанный метод `setTimeout(user.sayHi.bind(user), 100)`. Простая передача user.sayHi теряет получателя user.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Браузерный объект: const user={name:'Маша',sayHi(){console.log(this.name)}};. Нужно через 100 мс вывести именно имя user независимо от контекста, с которым таймер вызывает callback. До срабатывания свойства не меняются. Покажите два решения.
Ответ
Передайте обёртку setTimeout(() => user.sayHi(), 100) или заранее привязанный метод setTimeout(user.sayHi.bind(user), 100). Простая передача user.sayHi теряет получателя user.
Обёртка при срабатывании снова читает метод у user, а bind фиксирует конкретную функцию и объект при создании. Если метод позже заменить, это различие станет наблюдаемым. Задержка 100 мс задаёт минимальное ожидание планирования, а не обещает точное время исполнения. В этом условии оба варианта печатают Маша.