Как меняется значение this при отрыве метода от объекта

Метод потерял привязку к obj. В строгом режиме fn() получит this === undefined и выбросит TypeError; в нестрогом глобальное this обычно даст undefined при отсутствии a.

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

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

Метод потерял привязку к obj. В строгом режиме fn() получит this === undefined и выбросит TypeError; в нестрогом глобальное this обычно даст undefined при отсутствии a.

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

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

Условие

Определите, что будет выведено в консоль после вызова функции fn().

const obj = {
  a: 1,
  show(num) {
    if (num !== undefined) {
      console.log(this.a + num);
      return;
    }
    console.log(this.a);
  },
};

const fn = obj.show;
fn();

Ответ

Метод потерял привязку к obj. В строгом режиме fn() получит this === undefined и выбросит TypeError; в нестрогом глобальное this обычно даст undefined при отсутствии a.

Присваивание const fn = obj.show сохраняет функцию, но не объект-получатель. Значение a: 1 само по себе не привязывает метод. В ES-модуле действует строгий режим. Для гарантированного результата 1 используйте один из вариантов:

const bound = obj.show.bind(obj);
bound(); // 1
obj.show.call(obj); // 1
const wrapped = () => obj.show();
wrapped(); // 1

Стрелка-обёртка сохраняет вызов через объект; превращение самого метода в стрелку не решает задачу динамического this.

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

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

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

Подробнее