obj.a() выведет объект obj, а obj.b() — undefined. Внутри funcB обычный вызов funcA() не передаёт контекст внешнего метода, а строгий режим не подставляет глобальный объект.
Значение this при вызове методов объекта
obj.a() выведет объект obj, а obj.b() — undefined. Внутри funcB обычный вызов funcA() не передаёт контекст внешнего метода, а строгий режим не подставляет глобальный объект.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно предсказать, что появится в консоли после вызовов obj.a() и obj.b() в строгом режиме ("use strict") и дать объяснение того, как формируется контекст this.
"use strict";
// рассуждение вслух более ценно чем верный ответ
function funcA() {
console.log(this);
}
function funcB() {
funcA();
}
const obj = {
a: funcA,
b: funcB,
};
obj.a();
obj.b();
Ответ
obj.a() выведет объект obj, а obj.b() — undefined. Внутри funcB обычный вызов funcA() не передаёт контекст внешнего метода, а строгий режим не подставляет глобальный объект.
При obj.a() функция funcA вызывается непосредственно как метод obj. При obj.b() объект действительно становится this внутри funcB, но эта функция вызывает funcA без получателя. Каждый обычный вызов определяет свой this независимо. Чтобы второй вывод тоже был obj, нужно вызвать funcA.call(this) внутри funcB; одной вложенности вызовов недостаточно.