Вопрос проверяет понимание того, как определяется this в JavaScript в зависимости от способа вызова функции.
this не “лежит” внутри функции навсегда — он определяется в момент вызова. Если функция вызвана как метод объекта (obj.fn()), то this обычно будет указывать на obj. Если вынести метод в переменную и вызвать как обычную функцию (const f = obj.fn; f()), то this потеряется: в strict mode станет undefined, а без strict mode — глобальным объектом (в браузере это window). У стрелочной функции нет своего this, она берет его из внешнего окружения.
this — это контекст вызова функции, который определяется call site (местом/способом вызова), а не местом объявления функции.
thisОбычно достаточно посмотреть на форму вызова:
Вызов как метод: obj.method()
this → obj
Обычный вызов функции: fn()
this → undefined в strict mode
this → глобальный объект без strict mode
Стрелочная функция: () => {}
this не меняется при вызове, берется снаружи
'use strict';
const user = {
name: 'Ann',
show() {
console.log(this.name);
},
};
user.show(); // "Ann" (this = user)
'use strict';
const user = {
name: 'Ann',
show() {
console.log(this);
},
};
const f = user.show;
f(); // undefined (strict mode)
this снаружи)'use strict';
const user = {
name: 'Ann',
showLater() {
setTimeout(() => {
console.log(this.name);
}, 0);
},
};
user.showLater(); // "Ann"
Потеря this часто случается, когда:
передаем метод как колбэк (onClick={obj.method})
деструктурируем метод (const { method } = obj)
используем setTimeout(obj.method, 0)
this зависит от формы вызова. Чтобы избежать неожиданностей, следи за тем, вызываешь ли ты функцию как obj.method() или как fn(); для колбэков часто используют bind, стрелки или обертку-функцию.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию