Что выведет greet через объект и отдельную переменную?

Вывод: «Привет, Лена», затем true. Отделённый вызов получает this === undefined, и чтение this.name бросает TypeError, который перехватывает catch.

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

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

Вывод: «Привет, Лена», затем 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, что не всегда желаемое исправление.

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

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

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

Подробнее