In questo tutorial imparerai a conoscere la funzione freccia JavaScript con l'aiuto di esempi.
La funzione freccia è una delle funzionalità introdotte nella versione ES6 di JavaScript. Ti permette di creare funzioni in modo più pulito rispetto alle normali funzioni. Ad esempio,
questa funzione
// function expression let x = function(x, y) ( return x * y; )
può essere scritto come
// using arrow functions let x = (x, y) => x * y;
utilizzando una funzione freccia.
Sintassi della funzione freccia
La sintassi della funzione freccia è:
let myFunction = (arg1, arg2,… argN) => ( statement(s) )
Qui,
myFunction
è il nome della funzionearg1, arg2,… argN
sono gli argomenti della funzionestatement(s)
è il corpo della funzione
Se il corpo ha una singola dichiarazione o espressione, puoi scrivere la funzione freccia come:
let myFunction = (arg1, arg2,… argN) => expression
Esempio 1: funzione freccia senza argomento
Se una funzione non accetta alcun argomento, è necessario utilizzare parentesi vuote. Per esempio,
let greet = () => console.log('Hello'); greet(); // Hello
Esempio 2: funzione freccia con un argomento
Se una funzione ha un solo argomento, puoi omettere le parentesi. Per esempio,
let greet = x => console.log(x); greet('Hello'); // Hello
Esempio 3: funzione freccia come espressione
Puoi anche creare dinamicamente una funzione e usarla come espressione. Per esempio,
let age = 5; let welcome = (age console.log('Baby') : () => console.log('Adult'); welcome(); // Baby
Esempio 4: funzioni freccia su più righe
Se il corpo di una funzione ha più istruzioni, è necessario inserirle tra parentesi graffe ()
. Per esempio,
let sum = (a, b) => ( let result = a + b; return result; ) let result1 = sum(5,7); console.log(result1); // 12
questo con la funzione freccia
All'interno di una funzione normale, questa parola chiave si riferisce alla funzione in cui viene chiamata.
Tuttavia, this
non è associato alle funzioni freccia. La funzione freccia non ha una propria this
. Quindi ogni volta che chiami this
, fa riferimento al suo ambito padre. Per esempio,
All'interno di una normale funzione
function Person() ( this.name = 'Jack', this.age = 25, this.sayName = function () ( // this is accessible console.log(this.age); function innerFunc() ( // this refers to the global object console.log(this.age); console.log(this); ) innerFunc(); ) ) let x = new Person(); x.sayName();
Produzione
25 undefined Finestra ()
Qui l' this.age
interno this.sayName()
è accessibile perché this.sayName()
è il metodo di un oggetto.
Tuttavia, innerFunc()
è una funzione normale e this.age
non è accessibile perché this
fa riferimento all'oggetto globale (oggetto Finestra nel browser). Quindi, this.age
all'interno della innerFunc()
funzione dà undefined
.
All'interno di una funzione freccia
function Person() ( this.name = 'Jack', this.age = 25, this.sayName = function () ( console.log(this.age); let innerFunc = () => ( console.log(this.age); ) innerFunc(); ) ) const x = new Person(); x.sayName();
Produzione
25 25
Qui, la innerFunc()
funzione viene definita utilizzando la funzione freccia. E all'interno della funzione freccia, si this
riferisce all'ambito del genitore. Quindi, this.age
dà 25 .
Argomenti vincolanti
Le funzioni regolari hanno argomenti vincolanti. Ecco perché quando si passano argomenti a una funzione normale, è possibile accedervi utilizzando la arguments
parola chiave. Per esempio,
let x = function () ( console.log(arguments); ) x(4,6,7); // Arguments (4, 6, 7)
Le funzioni freccia non hanno argomenti vincolanti.
Quando si tenta di accedere a un argomento utilizzando la funzione freccia, verrà visualizzato un errore. Per esempio,
let x = () => ( console.log(arguments); ) x(4,6,7); // ReferenceError: Can't find variable: arguments
Per risolvere questo problema, puoi utilizzare la sintassi di diffusione. Per esempio,
let x = (… n) => ( console.log(n); ) x(4,6,7); // (4, 6, 7)
Funzione freccia con promesse e richiamate
Le funzioni freccia forniscono una migliore sintassi per scrivere promesse e callback. Per esempio,
// ES5 asyncFunction().then(function() ( return asyncFunction1(); )).then(function() ( return asyncFunction2(); )).then(function() ( finish; ));
può essere scritto come
// ES6 asyncFunction() .then(() => asyncFunction1()) .then(() => asyncFunction2()) .then(() => finish);
Cose da evitare con le funzioni freccia
1. Non utilizzare le funzioni freccia per creare metodi all'interno degli oggetti.
let person = ( name: 'Jack', age: 25, sayName: () => ( // this refers to the global… // console.log(this.age); ) ) person.sayName(); // undefined
2. Non è possibile utilizzare una funzione freccia come costruttore . Per esempio,
let Foo = () => (); let foo = new Foo(); // TypeError: Foo is not a constructor
Nota : le funzioni freccia sono state introdotte in ES6 . Alcuni browser potrebbero non supportare l'uso delle funzioni delle frecce. Visita il supporto della funzione freccia JavaScript per saperne di più.