В этом коде происходит следующее:
Практическая задача: разбор кода javascript
В этом коде происходит следующее:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
const obj = {
name: 'Alex',
say() { console.info(this.name); }
};
const obj2 = { name: 'Ivan' }
const fn = obj.say.bind(obj).bind(obj2);
fn();
obj.say();
Ответ
В этом коде происходит следующее:
const obj = {
name: 'Alex',
say() { console.info(this.name); }
};
const fn = obj.say;
fn(); // undefined
obj.say(); // 'Alex'
Когда вызывается obj.say(), контекст this внутри метода указывает на объект obj, поэтому выводится 'Alex'.
Однако при присваивании const fn = obj.say; функция say теряет привязку к объекту, и при вызове fn() this становится либо undefined (в строгом режиме), либо глобальным объектом (в нестрогом). В результате this.name не определён, и выводится undefined.
Чтобы сохранить контекст, можно использовать bind:
const fn = obj.say.bind(obj);
fn(); // 'Alex'