Menu

Dichiarazione di funzione in JavaScript: sintassi, hoisting e return

Come dichiarare una funzione in JavaScript: la parola chiave function, i parametri, i valori di ritorno, l'hoisting e quando scegliere una dichiarazione o un'espressione.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una funzione è un blocco di passaggi con un nome

Ogni volta che vuoi dare un nome a un pezzo di logica e riutilizzarlo, scrivi una funzione. Il modo più vecchio e diretto in JavaScript è la dichiarazione di funzione: la parola chiave function seguita da un nome.

Leggendola da sinistra a destra:

  • function è la parola chiave che apre una dichiarazione.
  • greet è il nome della funzione.
  • (name) è la lista dei parametri: gli input che la funzione riceve.
  • Il blocco tra graffe è il corpo.
  • greet("Ada") è una chiamata. JavaScript esegue il corpo con name legato a "Ada".

Definire una funzione non la esegue. È la chiamata che la esegue.

Parametri e argomenti

La parola parametro indica il nome dentro la definizione della funzione. La parola argomento indica il valore passato quando la chiami. Nel parlato si usano come sinonimi; la distinzione conta quando leggi i messaggi di errore.

Qui base e exponent sono parametri. 2 e 10 sono argomenti. JavaScript li collega in ordine: il primo argomento al primo parametro, e così via.

A differenza di altri linguaggi, JavaScript non si lamenta se passi un numero sbagliato di argomenti. Quelli mancanti diventano undefined; quelli in più vengono ignorati in silenzio. È flessibile e a volte una trappola: vedremo i valori di default e i parametri rest in pagine successive.

return restituisce un valore

console.log scrive nell'output. return restituisce un valore a chi ha chiamato la funzione, così può usarlo:

Senza return, una funzione restituisce undefined:

return fa anche uscire subito dalla funzione. I return anticipati sono il modo standard per gestire i casi limite prima della logica principale:

I return anticipati evitano che il corpo principale diventi una piramide di if/else.

Hoisting: puoi chiamarla prima di definirla

Ecco una cosa che sorprende davvero chi arriva da altri linguaggi. Le dichiarazioni di funzione subiscono l'hoisting: JavaScript le porta in cima al loro scope prima di eseguire qualsiasi codice. Questo significa che puoi chiamare una funzione su una riga che sta sopra la sua dichiarazione:

Questo codice funziona senza problemi. Prima dell'esecuzione, il motore analizza lo scope, registra square come funzione e solo dopo inizia a eseguire le istruzioni dall'alto verso il basso.

È una differenza di comportamento reale tra le dichiarazioni di funzione e gli altri modi di creare una funzione (function expression, arrow function). Quelli subiscono l'hoisting come le variabili: il nome è noto, ma il valore viene assegnato solo quando la riga viene eseguita. Ne parliamo meglio tra poco.

La maggior parte delle guide di stile consiglia comunque di definire le funzioni prima di chiamarle. L'hoisting è una rete di sicurezza, non uno stile su cui fare affidamento.

Dichiarazioni ed espressioni

Una dichiarazione di funzione è un'istruzione a sé stante. Un'espressione di funzione compare dove ci si aspetta un valore, quasi sempre a destra di un'assegnazione:

Entrambe producono funzioni che puoi chiamare. Le differenze:

  • Le dichiarazioni subiscono l'hoisting per intero. Le espressioni seguono le regole di hoisting della variabile a cui sono assegnate (const e let restano nella temporal dead zone finché la riga non viene eseguita).
  • Le dichiarazioni devono avere un nome. Le espressioni possono essere anonime, anche se dargli un nome aiuta a leggere gli stack trace.
  • Le dichiarazioni non possono stare ovunque. In strict mode, una function foo() {} dentro un blocco if si comporta in modo incoerente tra i vari motori: lì usa un'espressione.

Per la maggior parte degli helper di primo livello in un file, una dichiarazione si legge bene. Per le funzioni passate come argomenti o assegnate a proprietà, di solito si sceglie un'espressione (o una arrow function).

Nomi e stile

Il nome di una funzione è una promessa su ciò che fa. Spendere qualche carattere in più per sceglierne uno descrittivo si ripaga la prima volta che qualcuno legge il codice.

Qualche convenzione che vale la pena adottare:

  • I nomi delle funzioni dovrebbero essere verbi: fetchProfile, computeTotal, sendEmail.
  • Usa il camelCase: è la norma in JavaScript.
  • Le funzioni che restituiscono un booleano spesso iniziano con is, has o can: isValid, hasAccess, canEdit.

L'obiettivo è che il punto di chiamata si legga come una frase.

Un piccolo esempio completo

Mettiamo insieme i pezzi: parametri, return anticipato, un nome descrittivo:

Una dichiarazione, una clausola di guardia, un return chiaro. Questa forma copre la maggior parte delle funzioni che scriverai.

Prossimo passo: le arrow function

Le dichiarazioni sono il cavallo da lavoro, ma il JavaScript moderno si appoggia molto a una sintassi più corta, le arrow function, soprattutto per callback e funzioni di una riga. Hanno un aspetto diverso, si comportano diversamente con this e sono l'argomento della prossima pagina.

Domande frequenti

Come si dichiara una funzione in JavaScript?

Usa la parola chiave function, seguita da un nome, dalle parentesi con i parametri e da un blocco. Esempio: function greet(name) { return 'Hi, ' + name; }. La chiami scrivendo il suo nome seguito dalle parentesi: greet('Ada').

Cos'è l'hoisting delle funzioni in JavaScript?

Le dichiarazioni di funzione vengono portate in cima al loro scope prima che il codice venga eseguito, quindi puoi chiamarle su una riga che sta sopra la loro definizione. Vale solo per le dichiarazioni con function: le function expression e le arrow function assegnate a let o const non subiscono lo stesso hoisting.

Qual è la differenza tra dichiarazione ed espressione di funzione?

Una dichiarazione è un'istruzione a sé stante (function greet() {}) e subisce l'hoisting. Un'espressione assegna una funzione a una variabile (const greet = function() {}) e segue le normali regole di hoisting delle variabili. Le dichiarazioni hanno per definizione un nome; le espressioni sono spesso anonime.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA