Как безопасно передать user.sayHi в setTimeout?

Передайте обёртку `setTimeout(() => user.sayHi(), 100)` или заранее привязанный метод `setTimeout(user.sayHi.bind(user), 100)`. Простая передача user.sayHi теряет получателя user.

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

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

Передайте обёртку 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 мс задаёт минимальное ожидание планирования, а не обещает точное время исполнения. В этом условии оба варианта печатают Маша.

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

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

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

Подробнее