Практическая задача: разбор кода 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'

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку