Что такое this в JavaScript и как он работает в объектах и функциях?
Что проверяют
Понимаете ли вы, что this определяется в момент вызова, а не в месте объявления. Это первое, что отличает знание синтаксиса от понимания языка.
Как отвечать
Значение this зависит от способа вызова. Правила по приоритету:
- new:
thisэто создаваемый объект; - явная привязка:
call,apply,bindзадаютthisаргументом; - вызов как метод:
obj.method()даётthis === obj; - обычный вызов:
undefinedв строгом режиме, глобальный объект в нестрогом.
Стрелочные функции стоят особняком: своего this у них нет, они берут его из окружающей области видимости в момент создания, и bind на них не действует. Именно поэтому колбэки удобно писать стрелками.
Классическая потеря контекста происходит при отрыве метода от объекта:
const user = { name: "Аня", hello() { console.log(this.name); } };
const f = user.hello;
f(); // undefined: вызов уже не через объект
setTimeout(user.hello, 0); // та же беда
setTimeout(() => user.hello(), 0); // так контекст сохраняетсяГде спотыкаются
Говорят, что this это текущий объект. Он определяется вызовом, и один и тот же метод даёт разное значение.
Используют стрелку как метод объекта и получают this из внешней области, а не сам объект.
Забывают привязать обработчик в классе и ловят Cannot read properties of undefined.
Не знают, что в модулях и классах строгий режим включён всегда, поэтому this в обычном вызове это undefined, а не глобальный объект.