Как вызывается контекст?
Объекты и прототипы
Контекст (`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 лексически из окружения, не зависит от вызова. Метод, вызванный не через точку, теряет контекст.