| 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: 15 let
|
|||
0