Проверяет понимание того, как значение this определяется в момент вызова функции, а не в момент её объявления, что критично для отладки JavaScript-кода.
В JavaScript значение this не привязано к функции навсегда. Оно вычисляется в момент вызова, исходя из того, как именно функция была вызвана. Это ключевое отличие от лексической области видимости переменных, которая определяется местом объявления.
obj.method(): this равен obj.fn(): в strict mode this равен undefined, иначе — глобальный объект.Рассмотрим пример, где одна и та же функция даёт разный this:
function whoAmI() {
console.log(this.name);
}
const user = { name: 'Alice', whoAmI };
const admin = { name: 'Bob', whoAmI };
user.whoAmI(); // Alice — this = user
admin.whoAmI(); // Bob — this = admin
const detached = user.whoAmI;
detached(); // undefined — this потерян
Функция объявлена один раз, но при вызове как метод разных объектов получает разный this. Если же мы отрываем метод от объекта и вызываем отдельно, контекст теряется — это классическая ошибка при передаче методов как колбэков.
Стрелочные функции не имеют собственного this. Они захватывают его лексически — из места объявления. Поэтому для них правило «this определяется вызовом» не работает.
const obj = {
name: 'Obj',
regular() { return this.name; },
arrow: () => this.name
};
obj.regular(); // 'Obj'
obj.arrow(); // undefined (this из внешней области)
Именно поэтому стрелочные функции удобны для колбэков внутри методов, где нужно сохранить this внешнего контекста, и опасны как методы объектов.
Итог: при отладке всегда смотрите на место вызова функции, а не на место её объявления. Если нужен предсказуемый this — используйте стрелочные функции, bind или явную передачу контекста.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию