JavaScript/Funzioni anonime
Precedente: Funzioni | Index | Avanti: Programmazione basata sugli oggetti |
Una funzione anonima è una funzione dichiarata senza alcun identificatore di nome per riferirsi ad essa. Come tale, una funzione anonima di solito non è accessibile dopo la sua creazione iniziale.
Definizione di funzione normale:
function hello() { alert('Hello world');}hello();
Definizione di funzione anonima:
var anon = function() { alert('I am anonymous');}anon();
Un uso comune delle funzioni anonime è come argomenti per altre funzioni. Un altro uso comune è come chiusura, per il quale si veda anche il capitolo sulle chiusure.
Uso come argomento di altre funzioni:
setTimeout(function() { alert('hello');}, 1000);
Sopra, la funzione anonima è passata a setTimeout, che eseguirà la funzione in 1000 millisecondi.
Uso come chiusura:
(function() { alert('foo');}());
Riduzione delle dichiarazioni anonime di cui sopra:
- Le parentesi circostanti sono un involucro per la funzione anonima
- Le parentesi finali avviano una chiamata alla funzione e possono contenere argomenti
Un altro modo per scrivere l’esempio precedente e ottenere lo stesso risultato:
(function(message) { alert(message);}('foo'));
Una rappresentazione alternativa di quanto sopra pone le parentesi iniziali alle parentesi circostanti e non alla funzione stessa, il che causa confusione sul perché le parentesi circostanti sono necessarie in primo luogo.
(function() { // …})();
Alcuni sono persino ricorsi a dare alla tecnica delle parentesi graffe di trascinamento nomi dispregiativi, nel tentativo di incoraggiare le persone a spostarle di nuovo all’interno delle parentesi graffe circostanti dove iniziano la funzione, invece delle parentesi graffe circostanti.
Una funzione anonima può riferirsi a se stessa tramite la variabile locale arguments.callee, utile per funzioni anonime ricorsive:
// returns the factorial of 10.alert((function(n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n;})(10));
Tuttavia, arguments.callee è deprecato in ECMAScript 5 Strict. I problemi con arguments.callee sono che rende impossibile realizzare la ricorsione di coda (un piano futuro per JavaScript), e risulta in un valore diverso. Invece di usare arguments.callee, si può usare un’espressione di funzione denominata:
// returns the factorial of 10.alert( (function factorial(n) { return (n <= 1) ? 1 : factorial(n - 1) * n;})(10) );
Un’espressione di funzione freccia è simile a ciò che in altri linguaggi di programmazione è noto come lambda, introdotto in ECMAScript 6 nel 2015. Fornisce una stenografia per creare funzioni anonime.
Esempi:
- x => x + 1
- Una funzione anonima con un argomento x che restituisce x + 1.
- x => {return x + 1}
- Come sopra, ma con un corpo di funzione.
- (x, y) => x + y
- Una funzione freccia a 2 margini.
- (x, y) => {return x + y}
Links:
- Funzioni # L’espressione funzione freccia, sviluppatore.mozilla.org
- Funzioni/Funzioni freccia, developer.mozilla.org