Как различаются this в методе, IIFE и стрелке?

Все четыре сравнения дают true. Обычный метод получает this при вызове, отделённая функция и IIFE в строгом режиме — undefined, стрелка сохраняет this вызова build.

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

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

Все четыре сравнения дают 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.

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

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

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

Подробнее