Вывод: «Привет, Лена», затем true. Отделённый вызов получает this === undefined, и чтение this.name бросает TypeError, который перехватывает catch.
Что выведет greet через объект и отдельную переменную?
Вывод: «Привет, Лена», затем true. Отделённый вызов получает this === undefined, и чтение this.name бросает TypeError, который перехватывает catch.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В строгом режиме выполните:
'use strict';
const user = {name:'Лена', greet(){ return `Привет, ${this.name}`; }};
console.log(user.greet());
const greet = user.greet;
try { console.log(greet()); }
catch (error) { console.log(error instanceof TypeError); }
Ответ
Вывод: «Привет, Лена», затем true. Отделённый вызов получает this === undefined, и чтение this.name бросает TypeError, который перехватывает catch.
Копирование ссылки на метод не копирует его связь с объектом. Поэтому второй console.log не получает строку приветствия: ошибка возникает при вычислении аргумента. Для сохранения получателя используйте user.greet.bind(user) либо обёртку. Если добавить optional chaining, контракт изменится: вместо исключения можно получить строку с undefined, что не всегда желаемое исправление.