Una funzione è un blocco di istruzioni, definito in precedenza, che possiamo chiamare, cioè eseguire. Il sistema, inteso come ambiente Javascript, mette già a disposizione decine di funzioni. Per i nostri scopi, però, possiamo crearne delle nuove, usando tutte le risorse del linguaggio.
Nei capitoli precedenti abbiamo usato spesso la funzione console.log() . L’abbiamo chiamata semplicemente scrivendola e racchiudendo fra le parentesi un valore o una variabile. Questa funzione è integrata nel sistema: noi non dobbiamo definirla, ma la usiamo semplicemente, perché qualcuno l’ha definita per noi in precedenza.
Le funzioni producono principalmente due tipi di effetti: fanno qualcosa (come console.log() ) o restituiscono qualcosa, cioè fanno un’operazione e ci danno indietro il risultato.
Le funzioni hanno dei parametri, cioè si aspettano uno o più valori, che noi possiamo passagli tra parentesi. In questo esempio, la funzione alert() accetta un parametro stringa che ci farà visualizzare un semplice popup. Cliccate su Result per avere un’anteprima.
Un classico esempio di una funzione che non fa un’azione, ma restituisce un qualcosa è Math.max :
Precisamente, Math.max accetta un numero infinito di parametri, separati da virgola e restituisce il numero maggiore fra essi. Naturalmente, le funzioni possono essere parti di un’espressione:
In questo esempio utilizziamo la funzione Math.min , che si comporta esattamente all’opposto di Math.max e la usiamo in un’espressione sommando al valore che restituisce il valore 100.
Definiamo una funzione
Oltre alle funzioni pre-esistenti, possiamo ovviamente creare nostre funzioni, che poi saranno disponibili in ogni punto del nostro progetto. Per farlo, dobbiamo assegnargli un nome ed eventualmente i parametri che la funzione si aspetta di ricevere quando viene chiamata. Tutto il corpo della funzione è racchiuso tra parentesi graffe { } :
Riprendendo l’esempio del ciclo for che calcola il fattoriale, possiamo rendere quel codice una funzione racchiudendola nella formula function e dandogli il nome calcolaFattoriale() . Noterete che la funzione, tra parentesi, si aspetta un parametro x , che è appunto il numero di cui vogliamo elaborare il fattoriale. Questa funzione non ha alcun output diretto. Essa restituisce un valore, che possiamo successivamente immagazzinare in una variabile o usare per altre operazioni a catena:
È importante capire che i parametri, come x per la funzione calcolaFattoriale() , vivono soltanto all’interno della funzione e si chiamano variabili locali ed assumono il valore che il chiamante gli da: nel nostro caso eseguendo calcolaFattoriale(7) , la x all’interno della funzione vale appunto 7.
Questo esempio dimostra come la variabile a all’esterno della funzione non viene influenzata da quella all’interno perché quest’ultima è stata dichiarata con var . Nel secondo caso, la stessa variabile a globale viene modificata all’interno della funzione cambia2() .
Funzioni come variabili
Un modo sempre più diffuso per scrivere una funzione è quello di trattarla come una qualsivoglia variabile.
Argomenti opzionali
Le funzioni che definiamo accetteranno, molto probabilmente, uno o più argomenti (parametri). Quando chiameremo queste funzioni potremmo però passargli più parametri di quanti ne aspettino o addirittura meno. Nel primo caso, se passiamo due argomenti ad una funzione che se ne aspetta uno, il secondo sarà semplicemente ignorato. Se invece la chiamiamo usando meno argomenti, quelli che non avremmo passato compariranno come undefined . In questo frangente Javascript è più flessibile rispetto ad altri linguaggi, con il risvolto che spesso non otterremo un errore se passiamo un numero sbagliato di argomenti.
Possiamo, in generale, sfruttare questo meccanismo per scrivere funzioni che accettano un numero variabile di argomenti.
Funzioni ricorsive
È perfettamente normale che una funzione chiami se stessa, purché non vada in infinite loop ovviamente! Ricreiamo la nostra funzione fattoriale in modo ricorsivo:
Questa versione della funzione fattoriale()
chiama se stessa ogni volta con un argomento diverso. Anche se dobbiamo ammettere che è elegante, vi sconsiglio di usare questa forma, perché è molto più lenta nell’esecuzione di un normale ciclo.