Mam ten prosty kod:Dlaczego tracę kontekst tego w JavaScript?
var o = {
a: 1,
b: 2,
f1: function()
{
alert(this.b);
}
}
var o2 = {
a: 11,
b: 22,
f2: function (j)
{
j();
}
}
Ale działa ten kod:
o2.f2(o.f1)
daje w wyniku niezdefiniowanej. (Podczas gdy im spodziewa się „22” jako wynik)
Teraz wiem, że kontekst upadł gdzieś. i stąd Gdybym zmienić kod w o2
do:
f2: function (j)
{
j.apply(this);
}
To działa oczywiście.
Ale moje pytanie brzmi:
- W jakim etapie straciłem kontekst?
nie rozumiem: kiedy j()
pracuje, tam jest właściwością w obiekcie o2
b
.
Czego mi brakuje?
Kiedy nazywasz to "f()" - metody JavaScript są * "funkcje niezwiązane" * (to znaczy, w przeciwieństwie do metod w innych językach są * nie * powiązane z konkretnym obiektem/instancją) i jest to połączenie -stronę, która określa "to" po wywołaniu. (Oczywiście, zobacz ['Function.bind'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind) lub równoważne emulacje.) – user2246674
Tracisz tak szybko podczas przekazywania 'o.f1'. Jeśli wykonasz 'var x = o.f1' i wywołasz' x() ',' f1' nie jest już związany. – Blender
@Blender Wiem o tym. ale dlaczego "to" nie dotyczy "o2"? to jest to, czego nie rozumiem. –