Molto spesso abbiamo bisogno di eseguire un’azione simile in molti punti dello script.
Ad esempio, dobbiamo mostrare un messaggio di bell’aspetto quando un visitatore accede, si disconnette e forse da qualche altra parte.
Le funzioni sono i principali “elementi costitutivi” del programma. Permettono al codice di essere chiamato molte volte senza ripetizione.
Abbiamo già visto esempi di funzioni integrate, come alert(message)
, prompt(message, default)
e confirm(question)
. Ma possiamo anche creare funzioni nostre.,
Dichiarazione di funzione
Per creare una funzione possiamo usare una dichiarazione di funzione.
assomiglia a questo:
function showMessage() { alert( 'Hello everyone!' );}
function
parola chiave va in primo luogo, va, poi, il nome della funzione, quindi un elenco di parametri tra parentesi (separati da virgola, vuoto nell’esempio di cui sopra) e infine, il codice della funzione, denominata anche “la funzione del corpo”, tra parentesi graffe.,
function name(parameters) { ...body...}
La nostra nuova funzione può essere chiamata con il suo nome: showMessage()
.
Per esempio:
function showMessage() { alert( 'Hello everyone!' );}showMessage();showMessage();
call showMessage()
esegue il codice della funzione. Qui vedremo il messaggio due volte.
Questo esempio dimostra chiaramente uno degli scopi principali delle funzioni: evitare la duplicazione del codice.,
Se mai abbiamo bisogno di cambiare il messaggio o il modo in cui viene mostrato, è sufficiente modificare il codice in un unico punto: la funzione che lo emette.
Variabili locali
Una variabile dichiarata all’interno di una funzione è visibile solo all’interno di quella funzione.
Per esempio:
le variabili Esterne
Una funzione può accedere a una variabile esterna, come ad esempio:
let userName = 'John';function showMessage() { let message = 'Hello, ' + userName; alert(message);}showMessage(); // Hello, John
La funzione ha pieno accesso alla variabile esterna. Può modificarlo pure.,
Ad esempio:
La variabile esterna viene utilizzata solo se non ce n’è una locale.
Se una variabile con lo stesso nome viene dichiarata all’interno della funzione, allora oscura quella esterna. Ad esempio, nel codice sottostante la funzione utilizza il locale userName
. Quello esterno viene ignorato:
Le variabili dichiarate al di fuori di qualsiasi funzione, come l’esterno userName
nel codice sopra, sono chiamate globali.
Le variabili globali sono visibili da qualsiasi funzione (a meno che non siano ombreggiate dai locali).,
È una buona pratica ridurre al minimo l’uso di variabili globali. Il codice moderno ha pochi o nessun globale. La maggior parte delle variabili risiede nelle loro funzioni. A volte, però, possono essere utili per memorizzare i dati a livello di progetto.
Parametri
Possiamo passare dati arbitrari alle funzioni usando parametri (chiamati anche argomenti di funzione) .
Nell’esempio seguente, la funzione ha due parametri: from
e text
.,
Quando la funzione viene chiamata nelle righe (*)
e (**)
, i valori indicati vengono copiati in variabili locali from
e text
. Quindi la funzione li usa.
Ecco un altro esempio: abbiamo una variabilefrom
e la passiamo alla funzione., Nota: la funzione cambia from
, ma la modifica non viene vista all’esterno, perché una funzione ottiene sempre una copia del valore:
Valori predefiniti
Se un parametro non viene fornito, il suo valore diventa undefined
.
Ad esempio, la suddetta funzioneshowMessage(from, text)
può essere chiamata con un singolo argomento:
showMessage("Ann");
Questo non è un errore. Tale chiamata produrrebbe "*Ann*: undefined"
., Non c’è text
, quindi si presume che text === undefined
.,
Se si desidera utilizzare un “default” text
in questo caso, quindi, si può specificare dopo =
:
function showMessage(from, text = "no text given") { alert( from + ": " + text );}showMessage("Ann"); // Ann: no text given
Ora, se il text
parametro non è passato, ottenere il valore di "no text given"
"no text given"
è una stringa, ma può essere un’espressione più complessa, che viene valutato solo ed assegnato se il parametro non è presente., Quindi, questo è anche possibile:
In JavaScript, un parametro predefinito viene valutato ogni volta che la funzione viene chiamata senza il rispettivo parametro.
Nell’esempio precedente,anotherFunction()
viene chiamato ogni volta cheshowMessage()
viene chiamato senza il parametrotext
.
Parametri predefiniti alternativi
A volte ha senso impostare valori predefiniti per i parametri non nella dichiarazione della funzione, ma in una fase successiva, durante la sua esecuzione.,parametro, ci si può confrontare con undefined
:
function showMessage(text) { if (text === undefined) { text = 'empty message'; } alert(text);}showMessage(); // empty message
…O potremmo usare il ||
operatore:
// if text parameter is omitted or "" is passed, set it to 'empty'function showMessage(text) { text = text || 'empty'; ...}
i Moderni motori JavaScript sostenere la nullish a coalescenza operatore ??
, è meglio quando falsy valori, come 0
, sono considerati regolari:
la Restituzione di un valore
una funzione può restituire Un valore nel codice chiamante come il risultato.,
Il più semplice esempio potrebbe essere una funzione che somma due valori:
function sum(a, b) { return a + b;}let result = sum(1, 2);alert( result ); // 3
La direttiva return
può essere in qualsiasi luogo della funzione. Quando l’esecuzione lo raggiunge, la funzione si arresta e il valore viene restituito al codice chiamante (assegnato a result
sopra).
Ci possono essere molte occorrenze di return
in una singola funzione. Ad esempio:
È possibile utilizzare return
senza un valore., That causes the function to exit immediately.
For example:
function showMovie(age) { if ( !checkAge(age) ) { return; } alert( "Showing you the movie" ); // (*) // ...}
In the code above, if checkAge(age)
returns false
, then showMovie
won’t proceed to the alert
.,
return
e il valorePer un lungo espressione return
, si potrebbe essere tentati di mettere su una riga separata, come questo:
return (some + long + expression + or + whatever * f(a) + f(b))
Che non funziona, perché JavaScript assume un punto e virgola dopo return
. Funzionerà come:
return; (some + long + expression + or + whatever * f(a) + f(b))
Quindi, diventa effettivamente un ritorno vuoto.,
Se vogliamo che l’espressione restituita si avvolga su più righe, dovremmo avviarla sulla stessa riga di return
. O almeno metti le parentesi di apertura come segue:
return ( some + long + expression + or + whatever * f(a) + f(b) )
E funzionerà proprio come ci aspettiamo.
Denominazione di una funzione
Le funzioni sono azioni. Quindi il loro nome è di solito un verbo. Dovrebbe essere breve, il più accurato possibile e descrivere ciò che fa la funzione, in modo che qualcuno che legge il codice ottenga un’indicazione di ciò che fa la funzione.,
È una pratica diffusa avviare una funzione con un prefisso verbale che descrive vagamente l’azione. Ci deve essere un accordo all’interno del team sul significato dei prefissi.
Ad esempio, le funzioni che iniziano con"show"
di solito mostrano qualcosa.
Funzione che inizia con Examples
Esempi di tali nomi:
Con i prefissi in atto, uno sguardo al nome di una funzione dà una comprensione che tipo di lavoro fa e che tipo di valore restituisce.,
Una funzione dovrebbe fare esattamente ciò che è suggerito dal suo nome, non di più.
Due azioni indipendenti di solito meritano due funzioni, anche se di solito vengono chiamate insieme (in tal caso possiamo creare una terza funzione che chiama quelle due).
Alcuni esempi di violazione di questa regola:
-
getAge
– sarebbe male se mostra unalert
con l’età (dovrebbe solo ottenere)., -
createForm
– sarebbe male se modificasse il documento, aggiungendo un modulo ad esso (dovrebbe solo crearlo e restituirlo). -
checkPermission
– sarebbe male se visualizza il messaggioaccess granted/denied
(dovrebbe solo eseguire il controllo e restituire il risultato).
Questi esempi assumono significati comuni di prefissi. Tu e il tuo team siete liberi di concordare altri significati, ma di solito non sono molto diversi. In ogni caso, dovresti avere una solida comprensione di cosa significa un prefisso, cosa può e non può fare una funzione prefissata., Tutte le funzioni con lo stesso prefisso devono rispettare le regole. E la squadra dovrebbe condividere le conoscenze.
Le funzioni che vengono utilizzate molto spesso a volte hanno nomi ultracorti.
Ad esempio, il framework jQuery definisce una funzione con $
. La libreria Lodash ha la sua funzione principale denominata _
.
Queste sono eccezioni. Generalmente i nomi delle funzioni dovrebbero essere concisi e descrittivi.
Functions == Commenti
Le funzioni dovrebbero essere brevi e fare esattamente una cosa., Se quella cosa è grande, forse vale la pena dividere la funzione in alcune funzioni più piccole. A volte seguire questa regola potrebbe non essere così facile, ma è sicuramente una buona cosa.
Una funzione separata non è solo più facile da testare ed eseguire il debug – la sua stessa esistenza è un ottimo commento!
Ad esempio, confrontare le due funzionishowPrimes(n)
di seguito. Ognuno emette numeri primi fino a n
.,
La prima variante utilizza un’etichetta:
function showPrimes(n) { nextPrime: for (let i = 2; i < n; i++) { for (let j = 2; j < i; j++) { if (i % j == 0) continue nextPrime; } alert( i ); // a prime }}
La seconda variante utilizza una funzione aggiuntiva isPrime(n)
per il test di primalità:
La seconda variante è più facile da capire, non è vero? Invece del pezzo di codice vediamo un nome dell’azione (isPrime
). A volte le persone si riferiscono a tale codice come auto-descrizione.
Quindi, le funzioni possono essere create anche se non intendiamo riutilizzarle. Strutturano il codice e lo rendono leggibile.,
Sommario
Una dichiarazione di funzione si presenta così:
function name(parameters, delimited, by, comma) { /* code */}
- I valori passati a una funzione come parametri vengono copiati nelle sue variabili locali.
- Una funzione può accedere a variabili esterne. Ma funziona solo da dentro e fuori. Il codice al di fuori della funzione non vede le sue variabili locali.
- Una funzione può restituire un valore. In caso contrario, il suo risultato è
undefined
.,
Per rendere il codice pulito e facile da capire, si consiglia di utilizzare principalmente variabili e parametri locali nella funzione, non variabili esterne.
È sempre più facile capire una funzione che ottiene parametri, lavora con loro e restituisce un risultato rispetto a una funzione che non ottiene parametri, ma modifica le variabili esterne come effetto collaterale.
Denominazione della funzione:
- Un nome dovrebbe descrivere chiaramente cosa fa la funzione. Quando vediamo una chiamata di funzione nel codice, un buon nome ci dà immediatamente una comprensione di ciò che fa e restituisce.,
- Una funzione è un’azione, quindi i nomi delle funzioni sono solitamente verbali.
- Esistono molti prefissi di funzioni ben noti come
create…
,show…
,get…
,check…
e così via. Usali per suggerire cosa fa una funzione.
Le funzioni sono i principali elementi costitutivi degli script. Ora abbiamo coperto le basi, quindi possiamo iniziare a crearle e usarle. Ma questo è solo l’inizio del percorso. Ci accingiamo a tornare a loro molte volte, andando più a fondo nelle loro caratteristiche avanzate.
Lascia un commento