DIFERENCIAS ENTRE VAR, LET Y CONST EN JAVASCRIPT

En JavaScript, var, let y const se utilizan para declarar variables, pero tienen diferencias clave en cuanto a alcance (scope), redeclaración, reasignación y hoisting. A continuación, se explica cada una en detalle:
  • var
    • Alcance: Global o de función (function scope). No respeta bloques {} como los de un if o for.
    • Permite redeclarar la misma variable en el mismo ámbito sin error.
    • Permite reasignar valores libremente.
    • Las variables se elevan (hoisting) al inicio de su ámbito y se inicializan con undefined.
    • Obsoleto en JavaScript moderno. Su uso puede causar errores debido al alcance global o de función y al hoisting impredecible.
    • Evítalo salvo que estés manteniendo código antiguo.
  • let
    • Alcance: De bloque (block scope). Solo es accesible dentro del bloque {} donde se declara.
    • No permite redeclarar la misma variable en el mismo ámbito.
    • Permite reasignar valores.
    • También se eleva, pero no se inicializa (entra en la "Temporal Dead Zone" o TDZ). Acceder a la variable antes de su declaración causa un error.
    • Úsalo cuando necesites una variable que pueda reasignarse (por ejemplo, en bucles o contadores).
  • const
    • Alcance: De bloque, igual que let.
    • No permite redeclarar, igual que let.
    • No permite reasignar el valor una vez definido.
    • Igual que let, se eleva pero está en la TDZ. Además, debe inicializarse al declararse.
    • Usarlo por defecto para variables que no se vayan a reasignar. Mejora la claridad y evita cambios accidentales.
    • Ideal para constantes, objetos o arrays que no serán reasignados (aunque sus contenidos puedan modificarse).
La Temporal Dead Zone (TDZ) es un concepto en JavaScript relacionado con el comportamiento de las variables declaradas con let y const. Se refiere al período entre el inicio del ámbito (scope) de una variable y el momento en que se le asigna un valor o se declara formalmente. Durante este período, intentar acceder a la variable resulta en un ReferenceError.
¿Por qué es importante entender estas diferencias? Porque si se tiene claro cómo funcionan estas declaraciones, se evitan errores comunes y se logra que el código sea más predecible. Por ejemplo: muchos todavía usan var porque “es lo tradicional”, sin darse cuenta de que tiene un alcance de función, lo cual puede ser un problema en bloques como bucles o condicionales. La variable puede terminar accesible donde no debería.