Почему call, apply и bind не меняют this стрелки?

У стрелки все три вызова возвращают outer: она захватила this при создании. Обычная функция в соответствующих вызовах вернула бы call, apply и bind.

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

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

У стрелки все три вызова возвращают outer: она захватила this при создании. Обычная функция в соответствующих вызовах вернула бы call, apply и bind.

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

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

Условие

Выполните код:

function make() { return () => this.id; }
const f = make.call({id: 'outer'});
console.log(f.call({id: 'call'}));
console.log(f.apply({id: 'apply'}));
console.log(f.bind({id: 'bind'})());

Сравните с обычной функцией function f() { return this.id; }.

Ответ

У стрелки все три вызова возвращают outer: она захватила this при создании. Обычная функция в соответствующих вызовах вернула бы call, apply и bind.

Call и apply всё ещё могут передавать аргументы стрелочной функции; игнорируется именно попытка заменить её this. Bind также способен привязывать аргументы, но не создаёт для стрелки новый контекст получателя. Поэтому механическая замена метода стрелкой меняет контракт: её стоит делать только тогда, когда нужен контекст окружающего вызова.

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

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

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

Подробнее