Как запретить изменять контекст?
Объекты и прототипы
Контекст (`this`) фиксируют (запрещают изменять) через `bind` (создаёт функцию с навсегда привязанным `this`) или стрелочную функцию (лексический `this`, который нельзя переопределить).
bind — фиксирует this
Создаёт новую функцию с зафиксированным this; повторный bind или call/apply его не изменят:
function greet() { return this.name; }
const bound = greet.bind({ name: 'Ann' });
bound(); // 'Ann'
bound.call({ name: 'Bob' }); // 'Ann' — bind победил, call не меняет
bound.bind({ name: 'Eve' })(); // 'Ann' — повторный bind не меняетСтрелочная функция — лексический this
У стрелки нет своего this — он берётся из окружения и не может быть изменён call/apply/bind:
const obj = {
name: 'Ann',
getArrow() {
return () => this.name; // this = obj навсегда (лексически)
},
};
const arrow = obj.getArrow();
arrow.call({ name: 'Bob' }); // всё равно 'Ann' — call не меняет стрелкуПоля класса со стрелками
Гарантируют фиксированный this для методов-обработчиков:
class Button {
handleClick = () => {
console.log(this); // всегда экземпляр
};
}Почему это нужно
- Не терять контекст в колбэках/обработчиках.
- Предотвратить случайную подмену
this.
Коротко для собеседования
Контекст фиксируют: bind (создаёт функцию с навсегда привязанным this — повторный bind/call его не меняют) или стрелочной функцией (лексический this из окружения, call/apply/bind на неё не влияют). Поля класса со стрелками гарантируют фиксированный this для обработчиков. Нужно, чтобы не терять/не подменять контекст.