JS: Funzioni ed eventi
Funzioni
function saluta(nome) {
return `Ciao, ${nome}!`;
}
let messaggio = saluta("Andrea");
console.log(messaggio); // "Ciao, Andrea!"
La sintassi ricorda Python (def diventa function, e serve la parola chiave return — identica in entrambi i linguaggi), con due differenze da notare:
function saluta(nome) {
return `Ciao, ${nome}!`;
}
- le graffe
{ }delimitano il corpo della funzione (niente indentazione obbligatoria come in Python — anche se restare indentati resta buona pratica per leggibilità) - i parametri non hanno un tipo dichiarato né un default “alla Python” con
=diretto nella firma in tutti i casi semplici, ma JS supporta comunque valori di default:
function saluta(nome = "ospite") {
return `Ciao, ${nome}!`;
}
console.log(saluta()); // "Ciao, ospite!"
console.log(saluta("Marco")); // "Ciao, Marco!"
Funzioni anonime e arrow function
Oltre alla sintassi con function, JS offre una scrittura più compatta molto usata, specialmente per funzioni brevi passate come argomento ad altre funzioni:
// Sintassi "arrow function"
const somma = (a, b) => {
return a + b;
};
// Se il corpo è una sola riga con return, si può abbreviare ancora:
const somma2 = (a, b) => a + b;
console.log(somma(2, 3)); // 5
console.log(somma2(2, 3)); // 5
Non è un tipo di funzione “diverso” concettualmente: è solo una sintassi più corta, molto comune quando la funzione è breve o viene passata come parametro (lo vedremo subito con gli eventi).
Eventi: far reagire la pagina
Finora il nostro JS eseguiva codice “una volta”, al caricamento della pagina. Gli eventi permettono di eseguire codice in risposta a un’azione dell’utente: un click, la pressione di un tasto, l’invio di un form.
<button id="mio-bottone">Clicca qui</button>
<script src="script.js"></script>
const bottone = document.getElementById("mio-bottone");
bottone.addEventListener("click", function() {
console.log("Hai cliccato il bottone!");
});
Tre passaggi, sempre gli stessi:
- Trovare l’elemento HTML (
document.getElementById(...)— lo approfondiamo nel capitolo sul DOM) - Chiamare
addEventListener(tipo_evento, funzione)su quell’elemento - Scrivere la funzione che deve eseguirsi quando l’evento scatta (detta callback, cioè “funzione richiamata dopo”)
Con la sintassi arrow function, lo stesso codice si scrive spesso così:
bottone.addEventListener("click", () => {
console.log("Hai cliccato il bottone!");
});
Note
addEventListenerè analogo aiBinddi wxPython, con la possibilità ulteriore di poter definire al volo la funzione evento da eseguire in risposta.
Piccola differenza di nomenclatura: in Python le funzioni collegabili conBindsono chiamate funzioni evento, in JS le funzioni abbinate adaddEventListenersono chiamate callback.
Altri eventi comuni
// Al passaggio del mouse
elemento.addEventListener("mouseover", () => {
console.log("Mouse sopra l'elemento");
});
// Alla pressione di un tasto
document.addEventListener("keydown", (evento) => {
console.log(`Hai premuto: ${evento.key}`);
});
// Quando la pagina ha finito di caricare
document.addEventListener("DOMContentLoaded", () => {
console.log("Pagina pronta");
});
Nota (evento) nell’esempio di keydown: il browser passa automaticamente alla funzione callback un oggetto con informazioni sull’evento accaduto (quale tasto, quale elemento, eccetera). Lo useremo molto nel capitolo sulla validazione dei form.
DOMContentLoaded è un evento speciale, molto usato: garantisce che il codice al suo interno parta solo dopo che tutto l’HTML è stato caricato — un’alternativa a metter lo <script> in fondo al <body>, utile soprattutto se lo script è nell’<head>.
Esercizi
Esercizio w321
Scrivi una funzione raddoppia(numero) che ritorna il doppio del numero passato. Chiamala con un paio di valori diversi e stampa i risultati con console.log().
Esercizio w322
Riscrivi la funzione dell’esercizio precedente come arrow function in forma abbreviata (una sola riga, senza return esplicito).
Esercizio w323
Crea un bottone HTML con id="saluto". In JS, aggiungi un addEventListener sul click che stampi in console "Ciao dal bottone!".
Esercizio w324
Nel seguente codice l’evento non scatta mai: manca la chiamata a addEventListener, ed è stata scritta erroneamente la chiamata diretta alla funzione. Correggi il problema:
const bottone = document.getElementById("mio-bottone");
function mostraMessaggio() {
console.log("Hai cliccato!");
}
bottone.mostraMessaggio();