Autor | Zpráva | ||
---|---|---|---|
Suta Profil |
#1 · Zasláno: 3. 1. 2012, 12:36:57 · Upravil/a: Suta
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 |
#2 · Zasláno: 3. 1. 2012, 16:31:32
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 |
#3 · Zasláno: 3. 1. 2012, 17:13:17 · Upravil/a: Suta
_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 |
#5 · Zasláno: 3. 1. 2012, 18:28:22
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 |
#6 · Zasláno: 3. 1. 2012, 21:49:49
Presne tento je pripad je pouzity ako priklad v Mozilla developer reference. V clanku je aj riesenie pomocou bind().
|
||
Suta Profil |
#7 · Zasláno: 4. 1. 2012, 09:55:19 · Upravil/a: Suta
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) |
||
Časová prodleva: 12 let
|
0