Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 29 di 112
  • livello avanzato
Indice lezioni

Funzioni anonime e oggetti "first-class"

Le funzioni in JavaScript sono oggetti di "prima classe": possiedono proprietà, possono essere dichiarate in modo anonimo (lambda) e assegnate a variabili.
Le funzioni in JavaScript sono oggetti di "prima classe": possiedono proprietà, possono essere dichiarate in modo anonimo (lambda) e assegnate a variabili.
Link copiato negli appunti

Nelle lezioni precedenti abbiamo visto come definire e utilizzare le funzioni e abbiamo avuto modo di notare la semplicità e la flessibilità di cui è dotato questo costrutto in JavaScript. Le caratteristiche che abbiamo visto sono abbastanza simili a quelle di altri linguaggi di programmazione, a parte forse l'ampia possibilità di definizione e gestione degli argomenti.

Come già accennato, in JavaScript le funzioni ricoprono un ruolo molto importante: utilizzate con competenza servono a realizzare codice molto efficace e a sfruttare a pieno la capacità espressiva del linguaggio.

Anche se a prima vista le funzioni JavaScript sembrano del tutto analoghe alle funzioni supportate da altri linguaggi di programmazione come C, Java, C#, in realtà esse sono sostanzialmente molto diverse.

Una funzione nella maggior parte dei linguaggi di programmazione è intesa come un meccanismo per identificare un gruppo di istruzioni da eseguire su richiesta, eventualmente con un passaggio di parametri. In JavaScript una funzione è qualcosa in più: una funzione JavaScript è in realtà un oggetto, più precisamente quello che tecnicamente è detto un oggetto di prima classe (first class object), cioè un'entità che può essere dinamicamente creata, distrutta, passata ad una funzione, assegnata ad una variabile, restituita come valore.

A differenza degli altri oggetti JavaScript basati, come abbiamo visto, su Object, una funzione ha come oggetto base Function. In quanto oggetto, pertanto, una funzione ha proprietà e metodi e può essere utilizzata come un qualsiasi altro oggetto.

Ad esempio, possiamo assegnare una funzione ad un nome come una variabile, come mostra il seguente esempio:

var somma = function(x, y) { 
	return x + y;
};

Come possiamo vedere dall'esempio, abbiamo utilizzato la parola chiave function per creare la funzione da assegnare alla variabile somma, proprio come una normale definizione di funzione. A differenza della definizione classica, però, in questo caso non abbiamo specificato un nome per la funzione.

Funzioni anominme o lambda

Una definizione di funzione che non specifica il nome è detta in genere funzione anonima o funzione letterale o funzione lambda.

Normalmente, nella definizione classica di una funzione specifichiamo un nome per poter accedere ad essa in un'altra parte di uno script. Nel caso in cui una funzione viene assegnata ad una variabile, invece, l'utilità del nome viene meno, dal momento che possiamo accedere ad essa tramite la variabile. Tuttavia, nessuno ci vieta di assegnare un nome ad una funzione anche quando questa viene assegnata ad una variabile.

Possiamo invocare una funzione associata ad una variabile accostando semplicemente al nome della variabile le parentesi tonde con gli eventuali parametri, come mostrato nel seguente esempio:

var z = somma(4, 8);
console.log(z);	// 12

Possiamo quindi vedere le parentesi tonde come una sorta di operatore per l'invocazione ed il passaggio dei parametri applicabile a variabili che fanno riferimento ad una funzione.

Più in generale, possiamo invocare una funzione utilizzando direttamente la sua versione anonima o letterale:

(function(x, y) {
	return x + y;
}(4,8));

Nell'esempio abbiamo fatto seguire alla definizione anonima di una funzione le parentesi con due parametri. Facciamo notare che l'intera espressione è racchiusa tra parentesi tonde. Questo è necessario perchè altrimenti il parser JavaScript, trovando la parola chiave function, tenterebbe di interpretare l'espressione come una definizione di funzione nel contesto globale.

Questo tipo di espressione è in genere chiamata immediately-invoked function expression (IIFE) oppure self-executing anonymous function ed offre una significativa capacità espressiva quando è utilizzata insieme ad altre caratteristiche delle funzioni JavaScript, come vedremo in seguito.

Abbiamo detto che, essendo un oggetto, una funzione prevede proprietà e metodi. Tra le proprietà di una funzione abbiamo ad esempio:

  • name, che indica il nome assegnatole;
  • length, che indica il numero di argomenti previsti.

var somma = function Sum(x, y) {
	return x + y;
};
console.log(somma.name);	// stampa "Sum"
console.log(somma.length);	// stampa 2

Da notare che nel caso di funzione anonima la proprietà name ha come valore una stringa vuota. Una funzione prevede anche dei metodi, ma di questi ci ccuperemo più avanti.

Ti consigliamo anche