Коротка відповідь
juniorthis — це контекст виконання, що визначає об’єкт, до якого належить виклик. У функціях this прив’язується до об’єкта, що ініціював виклик; у класах це екземпляр класу. У стрілкових функціях this береться з зовнішнього лексичного контексту.
Повне пояснення
Що це і навіщо
this— ключове слово, що посилається на об’єкт, у контексті якого виконується код. Воно дозволяє доступ до властивостей і методів цього об’єкта.
Ключові принципи
- У звичайних функціях
thisвизначається під час виклику: глобальний об’єкт у браузері,window/global, або об’єкт, що викликав функцію. - У класах
thisзавжди посилається на екземпляр класу, що створює об’єкт. - У стрілкових функціях (
=>)thisне створюється, а береться з лексичного оточення.
Як це працює
- При виклику
obj.method()JavaScript встановлюєthis = objперед виконанням тіла функції. - Якщо функція викликається без об’єкта (
func()),thisв режимі нестрогого режиму стає глобальним об’єктом, а у строгому —undefined.
Практика і реалізація
class Person {
constructor(name) { this.name = name; }
greet() { console.log(`Hi, ${this.name}`); }
}
const p = new Person('Anna');
p.greet(); // Hi, Anna
const obj = { value: 42, get() { return this.value; } };
console.log(obj.get()); // 42
const arrow = () => console.log(this);
arrow(); // this from surrounding scope
Тестування
- У Jest можна перевірити контекст, використовуючи мок-функції:
const mock = jest.fn();
obj.method = mock;
obj.method();
expect(mock).toHaveBeenCalledWith(expect.objectContaining({ name: 'Anna' }));
Особливості в контексті JS/TS Core
- У TypeScript можна явно типізувати
thisу функціях:function foo(this: HTMLElement) { … }. - У React‑компонентах класових компонентів
thisприв’язується до екземпляру компонента, що дозволяє використовуватиthis.stateіthis.setState.
Оптимізація та типові помилки
- Не використовуйте
thisу функціях, що передаються як колбеки без прив’язки (bind, arrow function) — це призведе доundefined. - У строгому режимі (
'use strict';) виклик функції без об’єкта повертаєundefined, що допомагає уникнути небажаних глобальних змінних.
Диагностика
- Якщо
thisне відповідає очікуваному об’єкту, перевірте спосіб виклику функції (метод, колбек, arrow function) і використайтеbindабо стрілкову функцію.
Часті помилки
- Виклик методу як колбек без прив’язки →
thisстаєundefined. - Використання
thisу функції, що оголошена як arrow → береться з зовнішнього контексту. - Зміна
thisу строгому режимі → помилка. - Неочікуваний глобальний
thisу браузері → небезпечне використання. - Перевантаження
thisу класах без правильного конструктору. - Втрата контексту при передачі методу у
setTimeout→ використайтеbind. - Неправильне типізування
thisу TS → помилки компіляції. - Зміна
thisчерезcall/applyбез необхідності → заплутаність коду.