Hai già visto Java e un po' di Python.
JavaScript è diverso, ma ti sentirai subito a casa.
Vediamo le basi con 5 argomenti + quiz finale.
Il modo sbagliato più comune è mettere lo
<script> nell'<head> senza accorgimenti.
Il browser esegue lo script prima che il contenuto della pagina sia caricato
→ se provi a leggere un elemento HTML, ottieni null.
public static void main(String[] args) è il punto di ingresso
del programma. In JS non c'è un main formale, l'equivalente è
DOMContentLoaded: è il momento in cui il DOM
è pronto e puoi cominciare a lavorarci.
I 3 modi più comuni per caricare uno script:
<script> document.addEventListener('DOMContentLoaded', () => { console.log('Il DOM è pronto!'); }); </script>
<script defer src="app.js"></script>
<body> ... contenuto ... <script src="app.js"></script> </body>
Riassunto:
defer → scarica in parallelo, esegue dopo il parse dell'HTML. Il più
usato.async → scarica in parallelo, esegue appena pronto (ordine non garantito). Utile
per analytics.DOMContentLoaded → equivalente logico per script inline.JavaScript è un linguaggio event-driven: il tuo programma rimane in ascolto e reagisce alle azioni dell'utente. Ogni volta che l'utente clicca, preme un tasto, sposta il mouse o invia un form, il browser genera un evento.
Per "catturare" un evento usi addEventListener:
const elemento = document.querySelector('#mioBottone'); elemento.addEventListener('click', (evento) => { console.log(evento.target); });
// click — quando l'utente clicca btn.addEventListener('click', () => { console.log('Hai cliccato!'); }); // submit — quando viene inviato un form form.addEventListener('submit', (e) => { e.preventDefault(); // evita il ricaricamento }); // keydown — quando viene premuto un tasto input.addEventListener('keydown', (e) => { if (e.key === 'Enter') { console.log('L\'utente ha premuto Enter'); } });
System.in.read() o Scanner:
è un approccio sincrono, il programma si blocca in attesa dell'input.
Gli eventi JS sono asincroni: il codice continua a girare e la callback
viene chiamata solo quando succede qualcosa.
Quando clicchi un elemento interno, l'evento non si ferma lì: risale la catena degli elementi genitori, come un'onda che si espande.
// Ordine: inner → parent → outer → ... → document btn.addEventListener('click', (e) => { e.stopPropagation(); // ferma la risalita });
Prova il bubbling — clicca una scatola
e.stopPropagation() su:
stopPropagation() su un click a div#inner,
chi NON riceve l'evento?
Il DOM (Document Object Model) è la rappresentazione ad albero della tua pagina HTML. Ogni tag HTML diventa un "nodo" che JavaScript può leggere, modificare, creare o cancellare.
const titolo = document.querySelector('h1'); const item = document.querySelector('.classe'); const tutti = document.querySelectorAll('.card'); // NodeList const main = document.getElementById('main');
titolo.textContent = 'Nuovo titolo'; contenuto.innerHTML = '<strong>Grassetto</strong> e testo'; titolo.style.color = '#f7df1e'; titolo.style.fontSize = '2rem'; // Classi CSS: il modo migliore titolo.classList.add('attivo'); titolo.classList.remove('nascosto'); titolo.classList.toggle('attivo'); // aggiunge o rimuove
const nuovo = document.createElement('div'); nuovo.className = 'card'; nuovo.textContent = 'Sono nuovo!'; document.querySelector('#lista').appendChild(nuovo); nuovo.remove();
Esperimento DOM
highlight a un elemento?
Quando il tuo programma deve aspettare qualcosa (una risposta dal server, un timer), non può bloccarsi. JavaScript usa le Promise per gestire queste situazioni.
CompletableFuture).
In JS tutto è single-thread, quindi se una chiamata di rete
bloccasse il browser si congelerebbe.
Una promise è come un "contratto" — parte come pending (in attesa) e poi diventa o fulfilled (mantenuta) o rejected (rifiutata). Non può essere entrambe.
const miaPromise = new Promise((resolve, reject) => { setTimeout(() => { const ok = Math.random() > 0.5; if (ok) { resolve('Tutto OK!'); // → fulfilled } else { reject('Errore'); // → rejected } }, 1000); }); // Modo 1: .then() e .catch() miaPromise .then(r => console.log(r)) .catch(e => console.error(e)); // Modo 2: async/await (più leggibile) async function esempio() { try { const r = await miaPromise; console.log(r); } catch (e) { console.error(e); } }
async e await sono solo una sintassi più leggibile
per le stesse Promise. I due modi sono equivalenti.
Laboratorio Promise — vedi gli stati in azione
const p = new Promise((resolve) => resolve(42)), come ottieni
il valore 42?
fetch() è la funzione built-in di JavaScript per fare richieste HTTP.
Restituisce una Promise, quindi si usa con async/await.
async function leggiDati() { try { const risposta = await fetch('https://jsonplaceholder.typicode.com/users?_limit=3'); if (!risposta.ok) { throw new Error(`HTTP: ${risposta.status}`); } const dati = await risposta.json(); dati.forEach(u => console.log(u.name)); } catch (err) { console.error('Errore:', err); } }
JSON:
JSON.stringify(obj) → da oggetto a stringa JSONJSON.parse(string) → da stringa JSON a oggettoProva fetch() — chiama un'API reale
risposta.json() dopo un fetch()?
Mettiti alla prova! Rispondi alle domande e scopri quanto hai imparato.
event.target in un event
listener?
div#inner dentro div#outer e non usi
stopPropagation(), in quale ordine scattano i listener?
textContent e
innerHTML?
document.createElement('div')?
fetch()?
JSON.parse()?