You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Чому? Якщо ми хочемо зрозуміти, чому це трапляється, загляньмо під капот, як працює виклик `obj.method()`.
@@ -68,7 +68,7 @@ hi(); // Помилка, тому що this - це undefined
68
68
*/!*
69
69
```
70
70
71
-
Тут `let hi = user.hi` поміщає функцію в змінну, а на наступному рядку, ця змінна повністю автономна, і тому не має `this`.
71
+
Тут `hi = user.hi` поміщає функцію в змінну, а на наступному рядку, ця змінна повністю автономна, і тому не має `this`.
72
72
73
73
**Щоб зробити виклик `user.hi()` робочим, JavaScript використовує трюк -- крапка `'.'` повертає не функцію, а значення спеціального [посилального типу](https://tc39.github.io/ecma262/#sec-reference-specification-type).**
74
74
@@ -91,7 +91,7 @@ hi(); // Помилка, тому що this - це undefined
91
91
92
92
Посилальний тип -- це особливий "посередницький" внутрішній тип, який використовується з метою передачі інформації від крапки `.` до дужок виклику `()`.
93
93
94
-
Будь-яка інша операція, наприклад присвоєння `let hi = user.hi` в цілому відкидає посилальний тип та приймає значення `user.hi` (функції) і передає його. Отже, будь-яка подальша операція "втрачає" `this`.
94
+
Будь-яка інша операція, наприклад присвоєння `hi = user.hi` в цілому відкидає посилальний тип та приймає значення `user.hi` (функції) і передає його. Отже, будь-яка подальша операція "втрачає" `this`.
95
95
96
96
Отже, як результат, значення `this` передається правильно тільки тоді, коли функція викликається безпосередньо за допомогою крапки `obj.method()` або синтаксису квадратних дужок `obj['method']()` (вони роблять одне й те ж саме). Існують різні способи розв’язання цієї проблеми, наприклад [func.bind()](/bind#solution-2-bind).
0 commit comments