⚠️ Il bug classico: closure dentro un ciclo con var
// Con "var" (scope di FUNZIONE, non di blocco):
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// → stampa 3, 3, 3 (sorprendente! non 0, 1, 2 come ci si aspetterebbe)
// Con "let" (scope di BLOCCO, una nuova variabile per ogni iterazione):
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 100);
}
// → stampa 0, 1, 2 (il comportamento atteso)
⚠️ Con var, esiste UNA SOLA variabile i condivisa da tutte le iterazioni del ciclo: quando i setTimeout eseguono (dopo che il ciclo è già finito), i vale già 3 per tutti. Con let, ogni iterazione crea una nuova variabile con scope di blocco, "catturata" separatamente da ogni closure — questo è uno dei motivi principali per cui oggi si preferisce sempre let/const a var.