Все четыре сравнения дают true. Обычный метод получает this при вызове, отделённая функция и IIFE в строгом режиме — undefined, стрелка сохраняет this вызова build.
Как различаются this в методе, IIFE и стрелке?
Все четыре сравнения дают true. Обычный метод получает this при вызове, отделённая функция и IIFE в строгом режиме — undefined, стрелка сохраняет this вызова build.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите вывод в JavaScript:
'use strict';
function build() {
return {
normal() { return this; },
arrow: () => this
};
}
const owner = {id: 1};
const obj = build.call(owner);
const detached = obj.normal;
console.log(obj.normal() === obj);
console.log(detached() === undefined);
console.log(obj.arrow() === owner);
console.log((function () { return this; })() === undefined);
Ответ
Все четыре сравнения дают true. Обычный метод получает this при вызове, отделённая функция и IIFE в строгом режиме — undefined, стрелка сохраняет this вызова build.
Синтаксис размещения функции в объекте сам по себе не закрепляет получателя для будущих вызовов. У стрелки нет собственного this: в этом примере она замыкает owner из выполнения build.call(owner). У обычного normal значение определяется заново. Явный строгий режим исключает неявную подстановку глобального объекта для вызовов без получателя.
Источник: developer.mozilla.org.