Что выведет консоль в примере №9

В нестрогом браузерном script без глобальных firstName/lastName вывод: Bill, undefined, Boris, Bill, undefined, Boris, undefined. В строгом режиме выполнение прервётся уже на b().

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

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

В нестрогом браузерном script без глобальных firstName/lastName вывод: Bill, undefined, Boris, Bill, undefined, Boris, undefined. В строгом режиме выполнение прервётся уже на b().

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

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

Условие

Определите, какие значения появятся в консоли при выполнении следующего JavaScript‑кода:

var a = {
  firstName: 'Bill',
  lastName: 'Ivanov',
  sayName: function() {
    console.log(this.firstName);
  },
  sayLastName: () => {
    console.log(this.lastName);
  }
};

a.sayName(); //

var b = a.sayName;
b(); //

a.sayName.bind({ firstName: 'Boris' })(); //

a.sayName(); //
a.sayLastName(); //

a.sayName.bind({ firstName: 'Boris' }).bind({ firstName: 'Tom' })(); //
a.sayLastName.bind({ lastName: 'Petrov' })(); //

Ответ

В нестрогом браузерном script без глобальных firstName/lastName вывод: Bill, undefined, Boris, Bill, undefined, Boris, undefined. В строгом режиме выполнение прервётся уже на b().

b — оторванный обычный метод; в строгом режиме его this равен undefined и чтение firstName бросает TypeError. bind создаёт новую связанную функцию, не меняя a.sayName. Повторный bind не заменяет уже закреплённый контекст, поэтому Boris не превращается в Tom. sayLastName — стрелка, использующая внешний this; bind не может сделать её контекстом объект с lastName Petrov. В ES-модуле внешнее this также undefined, что важно при рассмотрении стрелки отдельно.

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

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

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

Подробнее