Вывод: user, sync, global, user. Прямой вызов использует user; переданный отдельно метод вызывается браузерным таймером с глобальным получателем; обёртка снова вызывает метод у user.
Как this таймера отличается от this метода в браузере?
Вывод: 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 явно возвращают требуемую связь с объектом.