Как тип функции определяет значение this

baz при обычном вызове через obj выводит 2. bar берёт this из вызова foo: в strict mode это undefined и возникает TypeError; в нестрогом браузерном script обычно выводится undefined.

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

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

baz при обычном вызове через obj выводит 2. bar берёт this из вызова foo: в strict mode это undefined и возникает TypeError; в нестрогом браузерном script обычно выводится undefined.

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

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

Условие

Какой вывод появится в консоли при вызове методов bar() и baz()?

function foo() {
  const value = 1;

  return {
    value: 2,
    bar: () => {
      console.log(this.value);
    },
    baz: function () {
      console.log(this.value);
    }
  };
}

const obj = foo();

obj.bar(); // ?
obj.baz(); // ?

Ответ

baz при обычном вызове через obj выводит 2. bar берёт this из вызова foo: в strict mode это undefined и возникает TypeError; в нестрогом браузерном script обычно выводится undefined.

Локальная const value = 1 не является свойством this и не участвует в выводе. Стрелка bar не получает объект слева от точки как собственный this; обычная baz получает.

Если исходник выполняется в strict mode или ES-модуле, obj.bar() выбрасывает исключение и следующий obj.baz() без обработки ошибки вообще не выполнится. В нестрогом script foo() получает глобальный объект, и bar читает его value; при заранее заданном window.value результат будет зависеть от него. foo.call({ value: 7 }) привяжет стрелку к этому объекту.

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

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

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

Подробнее