Коротка відповідь
juniorthis — це контекст виклику, тобто об’єкт, на якому був зареєстрований event handler. У DOM‑подіях this зазвичай вказує на елемент, що генерує подію; у React‑функціональних компонентах this не використовується, а в класах — на інстанс компонента. Якщо обробник прив’язаний через bind або arrow function, this буде відповідно встановлено.
Повне пояснення
Що це і навіщо
- this в JavaScript — ключове слово, що посилається на об’єкт, у контексті якого виконується функція. У випадку event handler‑ів це об’єкт, що генерує подію.
Ключові принципи
- DOM‑події:
this→ елемент, що викликав подію (наприклад,<button>). - React клас:
this→ інстанс компонента, якщо обробник не прив’язаний черезbindабо arrow function. - React функціональний компонент:
thisне використовується; замість цього застосовують хуки. - Arrow function:
thisзахоплює контекст зовнішньої функції. - bind:
thisявно встановлюється при створенні обробника.
Як це працює
- При додаванні слухача (
element.addEventListener('click', handler)) браузер зберігає посилання наhandlerі контекст елемента. - При спрацьовуванні події браузер викликає
handler.call(element, event). - У класах React, якщо обробник не прив’язаний,
thisбудеundefinedу strict mode; тому потрібнеbindабо arrow function.
Практика і реалізація
// DOM‑подія
button.addEventListener('click', function(e) {
console.log(this); // <button>
});
// React клас
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log(this); // MyComponent instance
}
}
Тестування
У Jest можна перевірити контекст:
const handler = jest.fn();
button.addEventListener('click', handler);
button.click();
expect(handler.mock.calls[0][0].target).toBe(button);
Безпека і приватність
Неправильне використання this у класах може призвести до помилок, що впливають на логіку UI. Завжди прив’язуйте обробники або використовуйте arrow functions.
Оптимізація
У React функціональних компонентах уникати this зменшує кількість об’єктів і підвищує читабельність коду.