Вопрос проверяет, умеешь ли ты управлять this и понимаешь ли разницу между “фиксированием контекста” и лексическим this.
Контекст можно привязать через bind, call, apply, через обертку (() => fn.call(obj)), или используя стрелочную функцию там, где нужен this извне. bind возвращает новую функцию с “приклеенным” this и (опционально) аргументами. Стрелочная функция не имеет собственного this и берет this из внешней области видимости, поэтому ее нельзя “перебиндить”. bind удобен, когда нужна повторно используемая функция с фиксированным this, а стрелка — когда важно сохранить внешний контекст (например, внутри метода при передаче колбэка).
Привязка контекста — это способ сделать так, чтобы внутри функции this был предсказуемым, даже если функция вызвана “не как метод”.
thisbind
фиксирует this
может частично “подставить” аргументы (каррирование)
возвращает новую функцию
call / apply
вызывают функцию сразу
задают this для конкретного вызова
разница: call(fn, a, b), apply(fn, [a, b])
Обертка-стрелка
сохраняет внешний this
позволяет явно вызвать с нужным контекстом
bind отличается от стрелочной функцииbind “приклеивает” this к функции'use strict';
function show() {
console.log(this.name);
}
const user = { name: 'Ann' };
const bound = show.bind(user);
bound(); // "Ann"
this лексический и не меняется'use strict';
const user = {
name: 'Ann',
showLater() {
const arrow = () => console.log(this.name);
arrow();
},
};
user.showLater(); // "Ann"
'use strict';
const user1 = { name: 'Ann' };
const user2 = { name: 'Bob' };
const arrow = () => console.log(this); // this берется снаружи (в модуле обычно undefined)
const bound = arrow.bind(user1);
bound(); // не станет user1
bind полезен, когда:
нужно передать функцию как колбэк и не потерять this
нужна функция, которую будешь переиспользовать много раз
Стрелка полезна, когда:
пишешь колбэк внутри метода и хочешь сохранить this метода
не хочешь думать о this внутри вложенных функций
bind создает новую функцию с фиксированным this и подходит для переиспользуемых колбэков. Стрелка не создает свой this и просто “наследует” внешний контекст — идеально для вложенных обработчиков внутри методов.