Vysvětlete hodnotu „this“
V následujícím kódu jsme měli v úmyslu volat metodu obj.jdi() čtyřikrát za sebou.
Avšak volání (1) a (2) fungují jinak než (3) a (4). Proč?
let obj, metoda;
obj = {
jdi: function() { alert(this); }
};
obj.jdi(); // (1) [object Object]
(obj.jdi)(); // (2) [object Object]
(metoda = obj.jdi)(); // (3) undefined
(obj.jdi || obj.stůj)(); // (4) undefined
Zde je vysvětlení.
-
Toto je běžné volání metody objektu.
-
Totéž, závorky tady nezmění pořadí operací, tečka je i tak první.
-
Zde máme složitější volání
(výraz)(). Toto volání funguje tak, jako by bylo rozděleno na dva řádky:f = obj.jdi; // vypočítáme výraz f(); // zavoláme to, co mámeZde se
f()spustí jako funkce bezthis. -
Podobně jako
(3), nalevo od závorek()máme výraz.
Abychom vysvětlili chování (3) a (4), musíme si vzpomenout, že operátory přístupu k vlastnostem (tečka nebo hranaté závorky) vracejí hodnotu referenčního typu.
Jakákoli operace na ní kromě volání metody (např. přiřazení =, nebo ||) ji změní na obyčejnou hodnotu, která neobsahuje informaci umožňující nastavit this.