Что такое контекст (this) в JavaScript
Что проверяют
Понимаете ли вы, что this определяется способом вызова, а не местом объявления. Это отличает от языков, где this всегда указывает на экземпляр.
Как отвечать
Значение this выясняется в момент вызова, и правил четыре, по приоритету:
new: новый объект;- явная привязка через
call,apply,bind: то, что передали; - вызов как метода (
obj.method()): объект слева от точки; - обычный вызов:
undefinedв строгом режиме, глобальный объект в нестрогом.
Стрелочные функции стоят особняком: своего this у них нет вовсе, они берут его из окружающей области видимости в момент создания. Поэтому их удобно писать внутри методов и колбэков.
Классическая ловушка это потеря контекста при передаче метода:
const user = { name: "Аня", greet() { return `Привет, ${this.name}`; } };
const fn = user.greet;
fn(); // this потерян
user.greet(); // работает
fn.call(user); // работаетГде спотыкаются
Говорят, что стрелочная функция «привязывает this к родителю». Точнее: она его не имеет и ищет во внешней области, поэтому bind на ней не работает.
Ставят стрелочную функцию методом объекта и удивляются, что this не объект: она взяла контекст из места объявления.
Забывают, что в обработчике события у обычной функции this это элемент, а у стрелочной внешний контекст.
Не различают call и apply: разница только в способе передачи аргументов, по одному или массивом.