Поясніть значення "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
.