Как this таймера отличается от this метода в браузере?

Вывод: user, sync, global, user. Прямой вызов использует user; переданный отдельно метод вызывается браузерным таймером с глобальным получателем; обёртка снова вызывает метод у user.

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

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

Вывод: user, sync, global, user. Прямой вызов использует user; переданный отдельно метод вызывается браузерным таймером с глобальным получателем; обёртка снова вызывает метод у user.

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

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

Условие

Код выполняется как обычный нестрогий script, не ES-модуль, в браузере:

var label = 'global';
const user = {label: 'user', show() { console.log(this.label); }};
user.show();
setTimeout(user.show, 0);
setTimeout(() => user.show(), 0);
console.log('sync');

Каков порядок?

Ответ

Вывод: user, sync, global, user. Прямой вызов использует user; переданный отдельно метод вызывается браузерным таймером с глобальным получателем; обёртка снова вызывает метод у user.

Объявление var в обычном script создаёт соответствующее глобальное свойство. В ES-модуле, Node.js или при другом окружении это объяснение глобального значения нельзя переносить без проверки. Передача функции не сохраняет форму выражения user.show. Обёртка либо bind явно возвращают требуемую связь с объектом.

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

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

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

Подробнее