Сохраните связанную функцию: const fn = obj.say.bind(obj). bind закрепляет this, поэтому отдельный вызов fn() прочитает obj.a и выведет 1.
Контекст теряется при присваивании метода переменной
Сохраните связанную функцию: const fn = obj.say.bind(obj). bind закрепляет this, поэтому отдельный вызов fn() прочитает obj.a и выведет 1.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо исправить код так, чтобы при вызове функции fn() сохранялся правильный контекст объекта obj и в консоль выводилось значение 1.
const obj = {
a: 1,
say() {
console.log(this.a);
}
};
const fn = obj.say;
fn();
Ответ
Сохраните связанную функцию: const fn = obj.say.bind(obj). bind закрепляет this, поэтому отдельный вызов fn() прочитает obj.a и выведет 1.
const fn = obj.say.bind(obj);
fn(); // 1
Само присваивание obj.say не запоминает объект, из которого взят метод. Другой вариант — const fn = () => obj.say(), сохраняющий вызов через точку. Для разового обращения подойдёт obj.say.call(obj). Если функция передаётся в обработчик события или таймер, связанную версию можно передать напрямую.