Ricerca…
introduzione
Le funzioni freccia sono un modo conciso per scrivere funzioni anonime e lessicali in ECMAScript 2015 (ES6) .
Sintassi
x => y // Ritorno implicito
x => {return y} // ritorno esplicito
(x, y, z) => {...} // Argomenti multipli
async () => {...} // Funzioni freccia asincrone
(() => {...}) () // Espressione funzione invocata immediatamente
const myFunc = x
=> x * 2 // Un'interruzione di riga prima della freccia genera un errore "Token inatteso"
const myFunc = x =>
x * 2 // Un'interruzione di riga dopo la freccia è una sintassi valida
Osservazioni
Per ulteriori informazioni sulle funzioni in JavaScript, consultare la documentazione delle funzioni .
Le funzioni freccia fanno parte delle specifiche ECMAScript 6, pertanto il supporto del browser potrebbe essere limitato. La seguente tabella mostra le prime versioni del browser che supportano le funzioni freccia.
| Cromo | Bordo | Firefox | Internet Explorer | musica lirica | Opera Mini | Safari |
|---|---|---|---|---|---|---|
| 45 | 12 | 22 | attualmente non disponibile | 32 | attualmente non disponibile | 10 |
introduzione
In JavaScript, le funzioni possono essere definite in modo anonimo usando la sintassi "arrow" ( => ), che a volte viene chiamata espressione lambda a causa delle somiglianze del Common Lisp .
La forma più semplice di una funzione freccia ha i suoi argomenti sul lato sinistro di => e il valore di ritorno sul lato destro:
item => item + 1 // -> function(item){return item + 1}
Questa funzione può essere invocata immediatamente fornendo un argomento all'espressione:
(item => item + 1)(41) // -> 42
Se una funzione freccia richiede un singolo parametro, le parentesi attorno a quel parametro sono facoltative. Ad esempio, le seguenti espressioni assegnano lo stesso tipo di funzione a variabili costanti :
const foo = bar => bar + 1;
const bar = (baz) => baz + 1;
Tuttavia, se la funzione freccia non accetta parametri o più di un parametro, una nuova serie di parentesi deve racchiudere tutti gli argomenti:
(() => "foo")() // -> "foo"
((bow, arrow) => bow + arrow)('I took an arrow ', 'to the knee...')
// -> "I took an arrow to the knee..."
Se il corpo della funzione non è costituito da una singola espressione, deve essere racchiuso tra parentesi e utilizzare un'istruzione di return esplicita per fornire un risultato:
(bar => {
const baz = 41;
return bar + baz;
})(1); // -> 42
Se il corpo della funzione di freccia è costituito solo da un oggetto letterale, questo oggetto letterale deve essere racchiuso tra parentesi:
(bar => ({ baz: 1 }))(); // -> Object {baz: 1}
Le parentesi aggiuntive indicano che le parentesi di apertura e chiusura fanno parte dell'oggetto letterale, ovvero non sono delimitatori del corpo della funzione.
Lexical Scoping & Binding (Valore di "this")
Le funzioni della freccia sono indicate in modo lessicale ; ciò significa che la loro this legame è legato al contesto dell'ambito circostante. Vale a dire, qualunque cosa this riferisca a può essere preservata usando una funzione di freccia.
Dai un'occhiata al seguente esempio. La classe Cow ha un metodo che consente di stampare il suono che produce dopo 1 secondo.
class Cow {
constructor() {
this.sound = "moo";
}
makeSoundLater() {
setTimeout(() => console.log(this.sound), 1000);
}
}
const betsy = new Cow();
betsy.makeSoundLater();
Nella makeSoundLater() metodo, la this contesto si riferisce alla istanza corrente della Cow oggetto, così nel caso in cui chiamo betsy.makeSoundLater() , la this contesto si riferisce a betsy .
Usando la funzione freccia, conservo this contesto in modo che io possa fare riferimento a this.sound Quando viene il momento di stamparlo, che stamperà correttamente "moo".
Se avessi usato una funzione regolare al posto della funzione freccia, perderai il contesto di essere all'interno della classe e non sarai in grado di accedere direttamente alla proprietà sound .
Argomenti Oggetto
Le funzioni freccia non espongono un argomento oggetto; pertanto, gli arguments farebbero semplicemente riferimento a una variabile nell'ambito corrente.
const arguments = [true];
const foo = x => console.log(arguments[0]);
foo(false); // -> true
A causa di ciò, le funzioni freccia non sono a conoscenza del loro chiamante / chiamato.
Mentre la mancanza di un argomento oggetto può essere una limitazione in alcuni casi limite, i parametri di riposo sono generalmente un'alternativa adatta.
const arguments = [true];
const foo = (...arguments) => console.log(arguments[0]);
foo(false); // -> false
Ritorno implicito
Le funzioni freccia possono restituire implicitamente i valori semplicemente omettendo le parentesi graffe che tradizionalmente avvolgono il corpo di una funzione se il loro corpo contiene solo una singola espressione.
const foo = x => x + 1;
foo(1); // -> 2
Quando si utilizzano i ritorni impliciti, i valori letterali degli oggetti devono essere racchiusi tra parentesi in modo che le parentesi graffe non vengano scambiate per l'apertura del corpo della funzione.
const foo = () => { bar: 1 } // foo() returns undefined
const foo = () => ({ bar: 1 }) // foo() returns {bar: 1}
Ritorno esplicito
Le funzioni di freccia possono comportarsi in modo molto simile alle funzioni classiche in quanto è possibile restituire esplicitamente un valore utilizzando la parola chiave return ; semplicemente avvolgi il corpo della tua funzione in parentesi graffe e restituisci un valore:
const foo = x => {
return x + 1;
}
foo(1); // -> 2
La freccia funziona come un costruttore
Le funzioni freccia generano un TypeError quando utilizzato con la new parola chiave.
const foo = function () {
return 'foo';
}
const a = new foo();
const bar = () => {
return 'bar';
}
const b = new bar(); // -> Uncaught TypeError: bar is not a constructor...