Коротка відповідь
juniorВтрата контексту – це коли значення this в колбеку не відповідає очікуваному об’єкту. Вона виникає при передаванні методу як callback без прив’язки, наприклад у setTimeout або event listener. Запобігаємо через bind, arrow‑функції чи explicit this.
Повне пояснення
Що це і навіщо
Втрата контексту – явище, коли в момент виконання функції значення this не збігається з об’єктом, у якому вона була оголошена. Це часто призводить до помилок типу Cannot read property 'x' of undefined.
Ключові принципи/терміни
this– контекст виконання- callback – функція, передана як аргумент
bind,call,apply– методи прив’язки контексту- arrow function – лямбда, що захоплює
thisз зовнішнього блоку
Як це працює
Коли функція передається без прив’язки, JavaScript встановлює this як глобальний об’єкт (в браузері – window) або undefined у strict mode. Якщо функція очікує доступ до полів об’єкта, результат – помилка.
Практика і реалізація
const obj = {
x: 42,
show(){ console.log(this.x); }
};
// Втрата контексту
setTimeout(obj.show, 0); // → TypeError: Cannot read property 'x' of undefined
// Запобігання через bind
setTimeout(obj.show.bind(obj), 0); // → 42
// Запобігання через arrow‑функцію
setTimeout(() => obj.show(), 0); // → 42
Тестування
У Jest можна перевірити, що this прив’язано:
test('bind preserves this', () => {
const obj = { val: 1, fn() { return this.val; } };
const bound = obj.fn.bind(obj);
expect(bound()).toBe(1);
});
Оптимізація, типові помилки та edge cases
- Не забувайте про
use strict– у ньомуthisбудеundefined, що допомагає виявити помилки. - У React‑компонентах класів використовуйте
this.handleClick = this.handleClick.bind(this)у конструкторі або arrow‑функції. - У функціональних компонентах
useCallbackз правильним списком залежностей запобігає зайвим ре‑прив’язкам.
Часті помилки
- Передача методу без
bindуsetInterval. - Використання
thisв arrow‑функції, коли треба контекст класу. - Забудьте про
useCallbackу React – створюється нова функція щоразу.
Cheatsheet
bind(obj)– створює нову функцію з прив’язанимthis.- Arrow‑функція – захоплює
thisз зовнішнього блоку. - У strict mode
thisу звичайній функції –undefined.
Follow‑up питання
- Як працює
callіapply? - Чому arrow‑функції не мають власного
this?