Le funzioni freccia non sono progettate per essere utilizzate in ogni situazione semplicemente come una versione più breve di funzioni antiquate. Non intendono sostituire la sintassi della funzione utilizzando la function
parola chiave. Il caso d'uso più comune per le funzioni freccia è costituito da brevi "lambda" che non vengono ridefiniti this
, spesso utilizzati quando si passa una funzione come callback a qualche funzione.
Le funzioni freccia non possono essere utilizzate per scrivere metodi oggetto perché, come hai scoperto, poiché le funzioni freccia si chiudono sul this
contesto lessicale che lo racchiude, l' this
interno della freccia è quello corrente nel punto in cui hai definito l'oggetto. Vale a dire:
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner;
}
};
Nel tuo caso, volendo scrivere un metodo su un oggetto, dovresti semplicemente usare la function
sintassi tradizionale , o la sintassi del metodo introdotta in ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Ci sono piccole differenze tra loro, ma sono importanti solo se usi super
in getOwner
, cosa che non sei o se copi getOwner
su un altro oggetto.)
C'è stato un dibattito sulla mailing list es6 su una svolta nelle funzioni freccia che hanno una sintassi simile ma con la propria this
. Tuttavia, questa proposta è stata accolta male perché si tratta di un semplice zucchero sintattico, che consente alle persone di risparmiare digitando alcuni caratteri e non fornisce nuove funzionalità rispetto alla sintassi delle funzioni esistenti. Vedere l'argomento Funzioni delle frecce non associate .
this
diverso. È definito dall'ambiente lessicale in cui è stata creata la funzione, il che significa che ilthis
valore in cui crei lachopper
variabile sarà ilthis
valore della funzione. In altre parole, non farà riferimentochopper
all'oggetto.