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

Как вызывается контекст?

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

Контекст (`this`) вызывается (определяется) в момент вызова функции способом вызова: метод объекта, `new`, `call/apply/bind` или обычный вызов. Стрелка берёт контекст лексически.

Как определяется контекст при вызове

Вызов метода

this = объект слева от точки:

obj.method(); // this = obj

Вызов с new

this = новый создаваемый объект:

new Constructor(); // this = новый объект

Явная привязка (call/apply/bind)

fn.call(obj);       // this = obj, вызвать сразу
fn.apply(obj, []);  // this = obj, аргументы массивом
fn.bind(obj)();     // this = obj, новая функция

Обычный вызов

this = undefined (strict) / globalThis:

fn(); // this = undefined (strict)

Стрелочная функция

Нет своего this — берётся из внешнего лексического окружения, не зависит от способа вызова:

const arrow = () => this; // this из окружения

Частая проблема — потеря контекста

Метод, вызванный не через точку, теряет this:

const greet = obj.method;
greet(); // this потерян (undefined)
setTimeout(obj.method, 100); // тоже потерян

Решение — bind или стрелка-обёртка.

Коротко для собеседования

Контекст (this) определяется в момент вызова способом вызова: метод obj.fn() → obj, new Fn() → новый объект, fn.call/apply/bind(obj) → obj, обычный fn() → undefined (strict). Стрелка берёт this лексически из окружения, не зависит от вызова. Метод, вызванный не через точку, теряет контекст.

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