baz при обычном вызове через obj выводит 2. bar берёт this из вызова foo: в strict mode это undefined и возникает TypeError; в нестрогом браузерном script обычно выводится undefined.
Как тип функции определяет значение this
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 }) привяжет стрелку к этому объекту.