Spiegate il valore di "this"
Nel codice sotto vogliamo chiamare il metodo user.go()
volte di fila.
Ma le chiamate (1)
e (2)
funzionano diversamente da (3)
e (4)
. Perché?
let obj, method;
obj = {
go: function() { alert(this); }
};
obj.go(); // (1) [object Object]
(obj.go)(); // (2) [object Object]
(method = obj.go)(); // (3) undefined
(obj.go || obj.stop)(); // (4) undefined
Vediamo la spiegazione.
-
Questa è una normale chiamata ad un metodo dell’oggetto.
-
Stessa cosa, le parentesi non cambiano l’ordine delle operazioni, il punto viene eseguito per primo in ogni caso.
-
Qui abbiamo una chiamata più complessa
(expression).method()
. La chiamata viene interpretata come fosse divisa in due righe:f = obj.go; // calculate the expression f(); // call what we have
Qui
f()
viene eseguita come una funzione, senzathis
. -
Molto simile a
(3)
, alla sinistra del punto.
abbiamo un espressione.
Per spiegare il comportamento di (3)
e (4)
dobbiamo ricordare che la proprietà di accesso (il punto o le parentesi quadre) ritornano un valore di tipo riferimento.
Qualsiasi operazione tranne la chiamata ad un metodo (come l’assegnazione =
o ||
) trasforma questo riferimento in un valore oridnario, che non porta più le informazioni necessarie per impostare this
.