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 haveQui
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.