В нестрогом браузерном script без глобальных firstName/lastName вывод: Bill, undefined, Boris, Bill, undefined, Boris, undefined. В строгом режиме выполнение прервётся уже на b().
Что выведет консоль в примере №9
В нестрогом браузерном 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, что важно при рассмотрении стрелки отдельно.