Una funzione è un blocco di codice organizzato e riutilizzabile che serve a eseguire un'azione. In JavaScript ci sono diversi modi per definire le funzioni. Qui vedremo le dichiarazioni di funzione e le espressioni di funzione. Altre possibilità, come le funzioni freccia, saranno trattate in altri concetti.
Il modo standard per definire una funzione in JavaScript è la dichiarazione di funzione, chiamata anche definizione di funzione o istruzione di funzione.
È composta dalla parola chiave function, dal nome della funzione e da un elenco di parametri separati da virgole tra parentesi tonde (()).
Segue il corpo della funzione (l'insieme di istruzioni che definisce cosa fa la funzione) racchiuso tra parentesi graffe ({}).
function someName(param1, param2, param3) {
// ...
}
In JavaScript, per chiamare una funzione si scrive il nome della funzione seguito da una coppia di parentesi che contengono gli argomenti.
someName(arg1, arg2, arg3);
Quando lavori con i parametri all'interno del corpo della funzione, tieni presente i possibili effetti collaterali.
Per impostazione predefinita, in JavaScript tutti i parametri definiti nella dichiarazione di funzione sono opzionali.
Se fornisci meno argomenti di quanti sono i parametri, gli argomenti mancanti saranno undefined all'interno della funzione, vedi Null e Undefined.
In molti casi ha senso assegnare un valore predefinito più adatto di undefined.
Puoi farlo specificando i parametri predefiniti direttamente nella definizione della funzione.
function someName(param1 = defaultValue1, param2 = defaultValue2) {
// ...
}
Un'istruzione return termina l'esecuzione della funzione e specifica un valore da restituire a chi ha chiamato la funzione. Una funzione può avere più istruzioni return.
function checkNumber(num) {
if (num === 0) {
return 'You passed 0, please provide another number.';
}
return 'Thanks for passing such a nice number.';
}
Il valore restituito da una funzione può essere memorizzato in una variabile.
function sum(x, y) {
return x + y;
}
const total = sum(5, 10);
// => 15
Il risultato di una funzione che non restituisce alcun valore o che non ha un'istruzione return è undefined.
In JavaScript non esistono return impliciti.
function nakedReturn(a) {
a * 2;
return;
}
nakedReturn(1);
// => undefined
function noReturn(a) {
a * 2;
}
noReturn(1);
// => undefined
In JavaScript puoi restituire esattamente un solo valore. Se vuoi passare più informazioni, devi prima combinarle in un'unica entità, di solito in un oggetto o in un array.
function divide(a, b) {
return {
quotient: Math.floor(a / b),
remainder: a % b,
};
}
Una dichiarazione di funzione è un'istruzione a sé stante. A volte però è utile definire una funzione come parte di un'altra espressione, ad esempio in un'assegnazione, come parametro di una funzione (callback) o come valore in un oggetto. Questo si può fare con un'espressione di funzione. Ha la stessa sintassi di una dichiarazione di funzione, con la sola differenza che il nome della funzione può essere omesso per creare una funzione anonima.
const someFunction = function (param) {
// ...
};
someOtherFunction(function (param) {
// ...
});
const obj = {
someFunction: function (param) {
// ...
},
};
In questo esercizio scriverai ancora un po' di codice per preparare e cucinare la tua splendida lasagna, tratta dal tuo ricettario preferito.
Hai cinque attività. La prima riguarda la cottura vera e propria, le altre quattro riguardano la preparazione perfetta.
Quando hai una lasagna nel forno, vuoi sapere se puoi già tirarla fuori oppure no. Per essere sicuro che la lasagna non bruci nel forno, di solito imposti un timer. A volte però te ne dimentichi.
Scrivi una funzione cookingStatus che accetta come parametro il tempo rimanente sul timer, in minuti.
La funzione ha tre possibili risultati.
0, dovrebbe restituire 'Lasagna is done.'.'Not done, please wait.'.'You forgot to set the timer.'.Il timer non mostrerà mai un valore inferiore a 0.
cookingStatus(12);
// => 'Not done, please wait.'
cookingStatus();
// => 'You forgot to set the timer.'
Per la prossima lasagna che preparerai, vuoi essere sicuro di riservare abbastanza tempo per goderti la cucina. Hai già fatto un piano con tutti gli strati che avrà la tua lasagna. Ora vuoi stimare quanto tempo richiederà la preparazione, in base a quel piano.
Implementa una funzione preparationTime che accetta un array di strati e il tempo medio di preparazione per strato, in minuti.
La funzione dovrebbe restituire la stima del tempo totale di preparazione in base al numero di strati.
Se la funzione viene chiamata senza indicare il tempo medio di preparazione, si dovrebbe assumere 2 minuti.
const layers = ['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles'];
preparationTime(layers, 3);
// => 18
preparationTime(layers);
// => 12
Oltre a riservare il tempo, vuoi anche essere sicuro di avere abbastanza sugo e sfoglie per cucinare la lasagna dei tuoi sogni. Per ogni strato di sfoglie della tua lasagna ti serviranno 50 grammi di sfoglie. Per ogni strato di sugo ti serviranno 0,2 litri di sugo.
Definisci la funzione quantities che prende un array di strati come parametro.
La funzione determinerà poi la quantità di sfoglie e sugo necessaria per preparare il tuo pasto.
Il risultato dovrebbe essere restituito come un oggetto con le chiavi noodles e sauce.
quantities(['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles']);
// => { noodles: 100, sauce: 0.4 }
Un po' di tempo fa hai fatto visita a un amico e hai mangiato la lasagna da lui. Era fantastica e aveva qualcosa di speciale. L'amico ti ha mandato la lista degli ingredienti e ti ha detto che l'ultimo elemento della lista è l'«ingrediente segreto» che ha reso il pasto così speciale. Ora vuoi aggiungere anche tu quell'ingrediente segreto alla tua ricetta.
Scrivi una funzione addSecretIngredient che accetta due array di ingredienti come parametri.
Il primo parametro è la lista che ti ha mandato il tuo amico, il secondo è la lista di ingredienti della tua ricetta.
La funzione dovrebbe aggiungere l'ultimo elemento della lista del tuo amico in fondo alla tua lista.
L'array che rappresenta la tua ricetta dovrebbe essere modificato direttamente e la funzione non dovrebbe restituire nulla.
Il primo argomento, però, non dovrebbe essere modificato.
const friendsList = ['noodles', 'sauce', 'mozzarella', 'kampot pepper'];
const myList = ['noodles', 'meat', 'sauce', 'mozzarella'];
addSecretIngredient(friendsList, myList);
// => undefined
console.log(myList);
// => ['noodles', 'meat', 'sauce', 'mozzarella', 'kampot pepper']
Le quantità elencate nel tuo ricettario bastano solo per due porzioni. Dato che la prossima volta vuoi cucinare per più persone, vuoi calcolare le quantità per numeri diversi di porzioni.
Implementa una funzione scaleRecipe che prende due parametri.
La funzione dovrebbe restituire un oggetto ricetta con le quantità necessarie per il numero di porzioni desiderato. Vuoi però mantenere la ricetta originale. Questo significa che, in questa attività, l'argomento ricetta non dovrebbe essere modificato.
const recipe = {
noodles: 200,
sauce: 0.5,
mozzarella: 1,
meat: 100,
};
scaleRecipe(recipe, 4);
// =>
// {
// noodles: 400,
// sauce: 1,
// mozzarella: 2,
// meat: 200,
// };
console.log(recipe);
// =>
// {
// noodles: 200,
// sauce: 0.5,
// mozzarella: 1,
// meat: 100,
// };
Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.