W3docs

Espressioni di Funzione in JavaScript

JavaScript offre diversi modi per definire funzioni: scopri le differenze tra dichiarazioni di funzione ed espressioni di funzione con esempi pratici.

Introduzione alle Espressioni di Funzione in JavaScript

JavaScript offre diversi modi per definire funzioni, e due dei più fondamentali sono le dichiarazioni di funzione e le espressioni di funzione. Un'espressione di funzione ti permette di trattare una funzione come qualsiasi altro valore: puoi memorizzarla in una variabile, passarla a un'altra funzione o restituirla da una. Sapere esattamente come le espressioni differiscono dalle dichiarazioni — in particolare riguardo all'hoisting — ti salverà da una categoria di bug difficili da identificare.

Questa pagina tratta la sintassi delle espressioni di funzione, il motivo per cui si comportano diversamente dalle dichiarazioni, le espressioni con nome, gli usi più comuni nel mondo reale (callback, IIFE, gestori di eventi, codice asincrono) e come tutto questo si collega alle moderne arrow function.

Espressioni di Funzione: Sintassi e Utilizzo

Che cos'è un'Espressione di Funzione?

Un'espressione di funzione definisce una funzione come parte di un'espressione più ampia — tipicamente il lato destro di un'assegnazione. La funzione stessa è solo un valore, e la variabile a cui la assegni diventa il modo in cui la chiami. Ecco la forma più semplice:

javascript— editable

Confronta questo con una dichiarazione di funzione, che inizia con la parola chiave function come istruzione autonoma:

javascript— editable

Entrambe producono un greet chiamabile, ma vengono elaborate dal motore in momenti diversi — ed è esattamente di questo che tratta la sezione successiva.

Hoisting: la differenza chiave

Le dichiarazioni di funzione vengono hoisted: il motore le legge durante la fase di compilazione, quindi la funzione esiste prima della riga in cui è scritta. Puoi chiamarla in una posizione precedente nel file. Le espressioni di funzione no — il valore della funzione viene assegnato solo quando l'esecuzione raggiunge quella riga, quindi chiamarla troppo presto fallisce:

javascript— editable
Informazione

Nota: Con var, il nome greet viene hoisted ma il suo valore è undefined fino all'esecuzione dell'assegnazione, quindi chiamarla prima genera un TypeError ("greet is not a function"). Con let o const il nome si trova nella temporal dead zone e si ottiene invece un ReferenceError. In ogni caso la regola è la stessa: definisci un'espressione di funzione prima di usarla.

Caratteristiche delle Espressioni di Funzione

  • Funzioni anonime: Le espressioni di funzione sono spesso anonime — la funzione non ha un proprio nome e viene referenziata tramite la variabile.
  • Memorizzate in variabili: La funzione è un valore, quindi risiede in una variabile (o in un elemento di array, una proprietà di object, ecc.).
  • Cittadini di prima classe: In JavaScript, le funzioni sono valori di prima classe — possono essere passate come argomenti, restituite da altre funzioni e assegnate a variabili.
  • Espressioni di funzione con nome: Un'espressione può avere un proprio nome (es. let fn = function myFunc() {}). Il nome è visibile solo all'interno della funzione, il che migliora le stack trace e consente alla funzione di richiamare se stessa.
  • Arrow function: Il codice moderno usa spesso le arrow function (() => {}) come forma abbreviata di espressione, sebbene gestiscano this diversamente.

Espressioni di Funzione con Nome

Assegnare a un'espressione un nome interno consente alla funzione di referenziare se stessa in modo affidabile — utile per la ricorsione — anche se la variabile esterna viene in seguito riassegnata:

javascript— editable

Applicazioni Pratiche delle Espressioni di Funzione

Funzioni Callback

L'uso più comune di un'espressione di funzione è come callback — una funzione passata a un'altra funzione ed eseguita in seguito, dopo il completamento di un'operazione. Passare la funzione inline come espressione mantiene la logica esattamente nel punto in cui viene usata:

javascript— editable

IIFE (Espressione di Funzione Immediatamente Invocata)

Un IIFE è un'espressione di funzione che viene eseguita nel momento in cui è definita. Le parentesi di avvolgimento trasformano la funzione in un'espressione, e le () finali la chiamano immediatamente. Questo era il modo classico per creare uno scope privato ed evitare di far trapelare variabili nello scope globale:

javascript— editable
Informazione

Nota: Oggi, let/const con scope di blocco e i moduli ES coprono la maggior parte di ciò per cui venivano usati gli IIFE, quindi li vedrai meno nel codice nuovo — ma sono ancora comuni nelle librerie più vecchie e negli script impacchettati.

Espressioni di Funzione vs Dichiarazioni di Funzione

Dichiarazione di FunzioneEspressione di Funzione
Sintassifunction f() {} come istruzionelet f = function () {} all'interno di un'espressione
HoistingCompletamente hoisted — chiamabile prima della sua rigaNon chiamabile prima dell'esecuzione dell'assegnazione
NomeSempre con nomeSpesso anonima (può avere un nome)
Adatta perHelper di livello superiore usati in tutto il fileCallback, IIFE, definizioni condizionali

Una regola pratica: usa una dichiarazione per una funzione autonoma e riutilizzabile, e un'espressione quando la funzione è un valore che stai per passare da qualche parte o definire condizionalmente.

javascript— editable

Esempi Avanzati e Casi d'Uso

Gestione degli Eventi

Nel browser, le espressioni di funzione sono il modo naturale per collegare i gestori di eventi, poiché si passa la funzione direttamente a addEventListener:

document.getElementById('myButton').addEventListener('click', function () {
  console.log('Button clicked!');
});

Programmazione Asincrona

Con le Promise e async/await, le espressioni di funzione forniscono un modo conciso per passare unità di codice. Qui un'espressione di funzione gestisce ogni valore risolto:

javascript— editable

Conclusione

Padroneggiare le Espressioni di Funzione in JavaScript è fondamentale per scrivere codice efficiente e manutenibile. La loro flessibilità, unita alla potenza delle capacità di programmazione funzionale di JavaScript, le rende uno strumento indispensabile nell'arsenale di uno sviluppatore.

Ricorda, la scelta tra un'Espressione di Funzione e una Dichiarazione di Funzione dipende dai requisiti specifici del tuo codice e dal contesto in cui stai lavorando. Continua a esercitarti ed esplorare questi concetti per approfondire la tua comprensione e competenza in JavaScript.

Esercitazione

Pratica
Quali sono le caratteristiche delle espressioni di funzione in JavaScript?
Quali sono le caratteristiche delle espressioni di funzione in JavaScript?
Was this page helpful?