Поясніть значення "this"
У коді нижче ми маємо намір викликати метод obj.go() 4 рази поспіль.
Але виклики (1) та (2) працюють по-різному ніж (3) і (4). Чому?
let obj, method;
obj = {
go: function() { alert(this); }
};
obj.go(); // (1) [object Object]
(obj.go)(); // (2) [object Object]
(method = obj.go)(); // (3) undefined
(obj.go || obj.stop)(); // (4) undefined
Ось пояснення.
-
Це звичайний виклик методу об’єкта.
-
Те ж саме, дужки не змінюють порядок операцій тут, крапка спрацьовує спочатку в будь-якому випадку.
-
Тут у нас є більш складний виклик
(вираз)(). Виклик працює так, ніби він був розділений на два рядки:f = obj.go; // обчислити вираз f(); // викликати те, що ми маємоТут
f()виконується як функція, безthis. -
Ми маємо вираз подібну річ, як в
(3), ліворуч від дужок().
Щоб пояснити поведінку (3) та (4), ми повинні нагадати, що аксесори властивостей (крапка або квадратні дужки) повертають значення посисального типу.
Будь-яка операція на цьому, крім виклику методу (наприклад, присвоєння = або ||) перетворює його в звичайне значення, яке не носить інформацію, яка дозволяє встановити this.