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