Autor Zpráva
Suta
Profil
Poprvé jsem se setkal s následujícím chováním. Z jakého důvodu je změněn kontext na základě přeuložení metody objektu do lokální proměnné?

Zav.CustomEvent = {
    addHandler: function () {
        // při volání 1: this == Zav.CustomEvent
        // při volání 2: this == window
    }
}

      // volání 1
Zav.Methods.init_on = function() {
    Zav.CustomEvent.addHandler();
}

      // volání 2
Zav.Methods.init_on = function() {
    // přeuložení metody z důvodu úspory kódu a rychlosti volání
    var add = Zav.CustomEvent.addHandler;
    add({"on-neco-1", nejaka metoda});
    add({"on-neco-2", nejaka metoda});
    add({"on-neco-3", nejaka metoda});
    // ...
    add({"on-neco-678", nejaka metoda});
}
_es
Profil
Suta:
Z jakého důvodu je změněn kontext na základě přeuložení metody objektu do lokální proměnné?
Je to tak proste definované v špecifikácii ECMA scriptu.
Pri volaní funkcie o.f() je vo funkcii f this rovné objektu o.
Pri volaní funkcie f() je v tej funkcii this rovné globálnemu objektu, teda v prehliadači objektu window.
Suta
Profil
_es:
Zřejmě ano, ale nepřijde mi to logické. Čekal bych, že o.f() nebo of = o.f(); of() bude voláno pod stejným objektem. V určitých případech tedy velmi mrzuté, nevím, jak vyřešit případ výše.
Radek9
Profil
Suta:
Kdyby to tak fungovalo, tak je celý prototypový model javascriptu k ničemu. Můžeš si to zjednodušit, ale trošku jinak:
Zav.Methods.init_on = function() { 
    // přeuložení metody z důvodu úspory kódu a rychlosti volání 
    function add(obj){
      Zav.CustomEvent.addHandler(obj);
    }
    add({"on-neco-1", nejaka metoda}); 
    add({"on-neco-2", nejaka metoda}); 
    add({"on-neco-3", nejaka metoda}); 
    // ... 
    add({"on-neco-678", nejaka metoda}); 
}
_es
Profil
Suta:
Čekal bych, že o.f() nebo of = o.f(); of() bude voláno pod stejným objektem.
No ale ide o to, že to this práve rozlišuje to, akým spôsobom bola tá funkcia zavolaná, teda ide napríklad priradiť tú istú funkciu k rôznym ovládačom udalostí rôznych DOM objektov a this bude závislé od objektu, kde udalosť vznikla.

V určitých případech tedy velmi mrzuté, nevím, jak vyřešit případ výše.
Máš metódy apply a call, cez ktoré si nastavíš this na ľubovolný objekt, alebo nepoužiješ this.
srigi
Profil
Presne tento je pripad je pouzity ako priklad v Mozilla developer reference. V clanku je aj riesenie pomocou bind().
Suta
Profil
srigi:
Díky za zajímavou látku pro doplnění mezery.

Radek9, _es:
Díky.

a = {};
a.name = "Petr";
a.method = function(){
    return (this.name);
}
b = a.method;

 a.method(); // return "Petr" (this == a)
b(); // return "" (this == window)
b.apply(a); // return "Petr" (this == a)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: