Ho questo semplice codice:Perché perdo il contesto di questo in Javascript?
var o = {
a: 1,
b: 2,
f1: function()
{
alert(this.b);
}
}
var o2 = {
a: 11,
b: 22,
f2: function (j)
{
j();
}
}
Ma l'esecuzione di questo codice:
o2.f2(o.f1)
cede indefinita. (mentre mi aspetto "22" come risultato)
Ora, so che il contesto è andato da qualche parte. e quindi Se cambio il codice in o2
a:
f2: function (j)
{
j.apply(this);
}
Lo fa, ovviamente, il lavoro.
Ma la mia domanda è:
- In quale fase ho perso il contesto?
non capisco: quando j()
è in esecuzione, non v'è una proprietà b
nell'oggetto o2
.
Cosa mi manca?
Quando lo chiami come 'f()' - I metodi JavaScript sono * "funzioni non associate" * (cioè, a differenza dei metodi in altre lingue sono * non * associati a un particolare oggetto/istanza) ed è la chiamata -site che determina il 'this' quando viene invocato. (Naturalmente, vedi ['Function.bind'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind) o emulazioni equivalenti.) – user2246674
Lo perdi al più presto mentre passi intorno a 'o.f1'. Se si esegue 'var x = o.f1' e si chiama' x() ',' f1' non è più legato. – Blender
@Blender Lo so. ma perché "questo" non riguarda 'o2'? questo è ciò che non capisco –