Первые два вызова выведут Alice и John. Отдельный sayName() в строгом режиме выбросит TypeError; в обычном браузерном script выведет window.name, часто пустую строку.
Влияние контекста вызова на значение this
Первые два вызова выведут 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).