var let const JavaScript: La Guida DEFINITIVA alle Differenze (2025)

Il Tutorial ESSENZIALE per DOMINARE Scope, Hoisting e Mutabilità.

🚀 Introduzione

Se hai iniziato a programmare con JavaScript prima del 2015, probabilmente hai usato solo la parola chiave var. Tuttavia, padroneggiare le var let const JavaScript è la competenza di base per ogni sviluppatore moderno. L’introduzione di ES6 (ECMAScript 2015) ha portato due nuovi e fondamentali modi per dichiarare le variabili: let e const.

Comprendere le differenze non è solo una questione di sintassi; è la base per scrivere codice moderno, privo di bug legati allo scope e incredibilmente più leggibile. Questo articolo ti guiderà attraverso i concetti chiave (Scope, Hoisting e Mutabilità) per farti padroneggiare subito l’uso corretto di ciascuna.


1. La Differenza ESSENZIALE: Lo Scope

Lo scope definisce dove una variabile è accessibile all’interno del codice. Questa è la distinzione più importante tra le tre parole chiave, e il motivo principale per cui var è stata abbandonata a favore di let e const.

1.1. var: Scope di Funzione (Function Scope)

Le variabili dichiarate con var sono definite per l’intera funzione in cui si trovano (o globalmente se dichiarate al di fuori di qualsiasi funzione). Non rispettano lo scope di blocco (es. i blocchi if o i cicli for).

JavaScript

function usaVar() {
    if (true) {
        var messaggio = "Sono accessibile ovunque nella funzione.";
    }
    // Nessun errore: var è visibile qui, fuori dal blocco if!
    console.log(messaggio); // Output: "Sono accessibile ovunque nella funzione." 
}

1.2. let e const: Scope di Blocco (Block Scope)

Le variabili dichiarate con let e const sono limitate allo scope di blocco (ovvero, tutto ciò che è racchiuso tra parentesi graffe {}). Questo previene molti bug involontari, specialmente nei cicli.

JavaScript

function usaLetConst() {
    if (true) {
        let contatore = 1;
        const ID_CLIENTE = 456;
    }
    // Errore: contatore e ID_CLIENTE non sono definiti fuori dal blocco {}
    // console.log(contatore); // Riferimento Errore
}

2. Hoisting (Sollevamento)

Il concetto di hoisting si riferisce al modo in cui il motore JavaScript gestisce le dichiarazioni di variabili durante la fase di compilazione.

Parola ChiaveDichiarazione Sollevata?Inizializzazione Sollevata?
varSì (a undefined)
let e constNo (entra in Temporal Dead Zone)

2.1. var: Hoisting Completo

Con var, la dichiarazione viene “sollevata” in cima al suo scope (la funzione) e inizializzata automaticamente a undefined. Questo permette di usare la variabile prima che venga dichiarata, il che è una fonte di confusione e di bug.

JavaScript

console.log(auto); // Output: undefined (l'inizializzazione è sollevata)
var auto = "Fiat";

2.2. let e const: Temporal Dead Zone

Anche let e const vengono sollevate, ma non vengono inizializzate. Il tentativo di accedervi prima della riga di dichiarazione genera un errore ReferenceError immediato. L’area di codice prima della dichiarazione è chiamata Temporal Dead Zone (TDZ).

JavaScript

// console.log(piatto); // Errore: Cannot access 'piatto' before initialization (TDZ)
let piatto = "Pasta"; 

3. Riassegnazione e Mutabilità

Questo è il punto in cui let e const si differenziano.

3.1. let: Mutabile (Può essere Riassegnato)

La variabile let può essere dichiarata e successivamente riassegnata a un nuovo valore.

JavaScript

let punteggio = 100;
punteggio = 250; // OK: riassegnazione permessa
console.log(punteggio); // Output: 250

3.2. const: Immutabile (Non può essere Riassegnato)

La variabile const (che sta per constant, costante) deve essere inizializzata al momento della dichiarazione e non può mai essere riassegnata.

JavaScript

const NOME_SITO = "fabiogulotta.it";
// NOME_SITO = "altro-sito"; // Errore: Assignment to constant variable

// Attenzione: Immutabilità del RIFERIMENTO
const utente = { nome: "Alice" };
// utente = { nome: "Bob" }; // Errore: Riassegnazione non permessa

// Questo è PERMESSO: l'oggetto interno è modificato, non il riferimento della variabile 'utente'
utente.nome = "Roberto"; 
console.log(utente.nome); // Output: Roberto

const assicura che il riferimento della variabile non cambi, ma non garantisce l’immutabilità del contenuto di oggetti o array.


4. Best Practices DEFINITIVE per il Codice Moderno

Per scrivere codice JavaScript pulito e professionale, segui queste semplici regole basate sull’uso corretto di var let const javascript:

  1. Dimentica var: Non dovresti mai più usare var nel codice moderno (ES6+). Il suo scope di funzione e l’ambiguità dell’hoisting sono fonti di bug.
  2. Usa const come Default: Inizia sempre dichiarando con const. Se il codice funziona, mantienilo. Questo comunica immediatamente l’intenzione che quel valore non cambierà.
  3. Usa let solo quando Riassegni: Riserva l’uso di let esclusivamente per i casi in cui sai che la variabile dovrà cambiare valore (es. contatori di cicli, totali calcolati, o variabili il cui stato deve essere modificato in un blocco if/else).
ScenarioParola ChiaveEsempio
Constante (o riferimento fisso)constconst PI = 3.14;, const fetchAPI = () => {}
Contatore (o variabile mutevole)letlet i = 0;, let totale = 0;
Legacy/Codice VecchiovarMAI

5. Conclusione

Passare dall’uso di var all’approccio strategico di let e const è il primo passo essenziale per qualsiasi sviluppatore che voglia adottare il javascript moderno es6. L’introduzione dello scope di blocco e la gestione rigorosa dell’inizializzazione e della riassegnazione sono miglioramenti che non solo rendono il codice più robusto, ma evitano intere classi di errori.


➡️ Sei pronto per il passo successivo? Impara come la destrutturazione (Destructuring) può lavorare in modo brillante con const per estrarre dati immutabili. Iscriviti alla nostra newsletter per ricevere guide avanzate.

Oppure:

📚 Leggi la guida successiva: “JavaScript Moderno: Padroneggiare la Destructuring e lo Spread Operator”.


Link Interni Correlati


Fonti Esterne Autorevoli

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *