PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

Как запретить изменять контекст?

Объекты и прототипы

Контекст (`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 для обработчиков. Нужно, чтобы не терять/не подменять контекст.

Другие вопросы раздела