назад до уроку

Поясніть значення "this"

важливість: 3

У коді нижче ми маємо намір викликати метод 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

Ось пояснення.

  1. Це звичайний виклик методу об’єкта.

  2. Те ж саме, дужки не змінюють порядок операцій тут, крапка спрацьовує спочатку в будь-якому випадку.

  3. Тут у нас є більш складний виклик (вираз)(). Виклик працює так, ніби він був розділений на два рядки:

    f = obj.go; // обчислити вираз
    f();        // викликати те, що ми маємо

    Тут f() виконується як функція, без this.

  4. Ми маємо вираз подібну річ, як в (3), ліворуч від дужок ().

Щоб пояснити поведінку (3) та (4), ми повинні нагадати, що аксесори властивостей (крапка або квадратні дужки) повертають значення посисального типу.

Будь-яка операція на цьому, крім виклику методу (наприклад, присвоєння = або ||) перетворює його в звичайне значення, яке не носить інформацію, яка дозволяє встановити this.