Как передать метод в таймер без потери получателя

Вывод: 7, undefined, 7. Сохранённая непривязанная ссылка вызывается без получателя, а обёртка таймера заново выполняет метод через obj.

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

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

Вывод: 7, undefined, 7. Сохранённая непривязанная ссылка вызывается без получателя, а обёртка таймера заново выполняет метод через obj.

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

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

Условие

Код выполняется в ES-модуле:

const obj = { value: 7, read() { return this?.value; } };
console.log(obj.read());
const read = obj.read;
console.log(read());
setTimeout(() => console.log(obj.read()), 0);

Определите вывод.

Ответ

Вывод: 7, undefined, 7. Сохранённая непривязанная ссылка вызывается без получателя, а обёртка таймера заново выполняет метод через obj.

Стрелка в setTimeout здесь не заменяет метод стрелкой: она лишь откладывает выражение obj.read(), сохраняющее получателя. Если напрямую передать obj.read в таймер, контракт this зависит от вызова таймерной системой. Для однозначного закрепления объекта можно передать obj.read.bind(obj).

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

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

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

Подробнее