У стрелки все три вызова возвращают outer: она захватила this при создании. Обычная функция в соответствующих вызовах вернула бы call, apply и bind.
Почему call, apply и bind не меняют this стрелки?
У стрелки все три вызова возвращают 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 также способен привязывать аргументы, но не создаёт для стрелки новый контекст получателя. Поэтому механическая замена метода стрелкой меняет контракт: её стоит делать только тогда, когда нужен контекст окружающего вызова.