Как работает this внутри метода объекта

После раскомментирования в strict mode возникнет TypeError: this обычной функции map равен undefined. В нестрогом браузерном script будет использовано глобальное name, а не Bob.

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

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

После раскомментирования в strict mode возникнет TypeError: this обычной функции map равен undefined. В нестрогом браузерном script будет использовано глобальное name, а не Bob.

Подробный разбор

Ответ с пояснениями

Условие

Нужно понять, какой вывод появится в консоли, если раскомментировать строку с вызовом console.log.

const person = {
  name: "Bob",
  roles: ["friend", "brother", "student"],
  getRoles: function () {
    return this.roles.map(function (role) {
      return this.name + " is " + role;
    });
  }
};
// console.log(person.getRoles()); // ?

Ответ

После раскомментирования в strict mode возникнет TypeError: this обычной функции map равен undefined. В нестрогом браузерном script будет использовано глобальное name, а не Bob.

Вызов person.getRoles() задаёт this только внешнему методу. callback map вызывается отдельно и без thisArg.

getRoles: function () {
  return this.roles.map(role => this.name + ' is ' + role);
}

Это исправленное тело метода: стрелка захватывает this, поэтому возвращаются 'Bob is friend', 'Bob is brother', 'Bob is student'. Альтернатива — передать this вторым аргументом map. В исходном нестрогом браузерном коде window.name часто является пустой строкой, поэтому нельзя универсально обещать текст 'undefined is ...'.

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

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

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

Подробнее