Влияние контекста вызова на значение this

Первые два вызова выведут Alice и John. Отдельный sayName() в строгом режиме выбросит TypeError; в обычном браузерном script выведет window.name, часто пустую строку.

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

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

Первые два вызова выведут Alice и John. Отдельный sayName() в строгом режиме выбросит TypeError; в обычном браузерном script выведет window.name, часто пустую строку.

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

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

Условие

Нужно указать, какие строки будут напечатаны в консоль при разных способах вызова функции sayName.

const obj1 = {
  name: "Alice",
  sayName: function() {
    console.log(this.name);
  }
}

const obj2 = {
  name: "John",
  sayName: obj1.sayName
}

const sayName = obj1.sayName;

obj1.sayName();   // ?
obj2.sayName();   // ?
sayName();        // ?

Ответ

Первые два вызова выведут Alice и John. Отдельный sayName() в строгом режиме выбросит TypeError; в обычном браузерном script выведет window.name, часто пустую строку.

Оба объекта хранят одну функцию, но this определяется получателем вызова: obj1 или obj2. Присваивание отдельной переменной не закрепляет контекст. У браузерного window уже существует свойство name, поэтому утверждение «обязательно undefined» неверно. Для стабильного Alice при самостоятельном вызове используйте const sayName = obj1.sayName.bind(obj1).

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

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

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

Подробнее