Вывод: 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).