Variables de JavaScript
Artículo de W3Docs sobre variables en JavaScript: declaración, uso de var, let y const, ámbito, hoisting y la Zona Muerta Temporal.
Introducción
Una variable es un contenedor con nombre para un valor. En JavaScript se crean variables para almacenar datos — el nombre de un usuario, un total acumulado, el resultado de un cálculo — y luego se hace referencia a esos datos por su nombre en el resto del programa.
Esta guía cubre todo lo necesario para declarar variables con confianza: las tres palabras clave (let, const y el antiguo var), cómo el ámbito determina dónde es visible una variable, qué significan en la práctica el hoisting y la Zona Muerta Temporal (TDZ), la diferencia entre reasignar y mutar un const, y las reglas de nomenclatura y convenciones que sigue la comunidad.
Versión corta: usa const por defecto, let cuando necesites reasignar, y evita var en código moderno.
Declarar una Variable
Se declara una variable con una palabra clave seguida de un nombre y, opcionalmente, se le asigna un valor con =:
JavaScript es de tipado dinámico: una variable no tiene un tipo fijo, por lo que la misma variable puede contener un string ahora y un número después. (Consulta Tipos de datos de JavaScript para conocer los valores que pueden almacenar las variables.)
Existen tres palabras clave de declaración:
const— para valores que no se van a reasignar (tu opción por defecto).let— para valores que sí se van a reasignar.var— la palabra clave original, mantenida por compatibilidad con versiones anteriores. Consulta El antiguo "var".
Comparación de let, const y var
| Palabra clave | Ámbito | ¿Reasignable? | ¿Redeclarable en el mismo ámbito? | Hoisting |
|---|---|---|---|---|
const | bloque | No | No | TDZ |
let | bloque | Sí | No | TDZ |
var | función | Sí | Sí | Hoisted, inicializado a undefined |
El ejemplo siguiente muestra las diferencias prácticas entre let/const con ámbito de bloque y var con ámbito de función:
Ámbito: dónde vive una Variable
El ámbito determina en qué parte del código se puede acceder a una variable. Para un tratamiento más profundo, consulta Ámbito de variable, closure.
Ámbito de bloque (let y const)
let y const solo son visibles dentro del bloque { ... } donde se declaran — un if, un bucle o cualquier par de llaves:
Por eso let es la opción correcta para los contadores de bucle: cada iteración de un bucle for obtiene su propio enlace.
Ámbito de función (var)
var ignora los bloques. Su ámbito se limita a la función envolvente más cercana (o al ámbito global si está fuera de cualquier función), lo que es una fuente común de errores:
Ámbito global
Una variable declarada fuera de cualquier función es global y accesible desde cualquier lugar. En los navegadores, un var de nivel superior se adjunta al objeto global window, mientras que let y const de nivel superior tienen ámbito de script y no lo hacen:
Hoisting y la Zona Muerta Temporal
El hoisting significa que las declaraciones se procesan antes de que el código se ejecute. Las tres palabras clave difieren en cómo realizan el hoisting.
Una declaración var se eleva e inicializa a undefined, por lo que leerla antes de la línea que la asigna devuelve undefined en lugar de un error:
let y const también se elevan, pero no se inicializan. Desde el inicio del bloque hasta la línea de declaración, la variable se encuentra en la Zona Muerta Temporal (TDZ) — acceder a ella lanza un ReferenceError:
La TDZ es una característica, no una rareza: detecta el uso accidental antes de la declaración que var oculta silenciosamente.
const: Reasignación vs. Mutación
const impide reasignar la variable — no se puede apuntar el nombre a un nuevo valor. No hace que el valor en sí sea inmutable. Los object y los array almacenados en un const pueden seguir modificándose:
Usa const para object y array siempre que no reasignes el enlace — documenta la intención y previene toda una clase de errores. Si realmente necesitas un object inmutable, usa Object.freeze().
Reglas de Nomenclatura y Convenciones
JavaScript impone algunas reglas estrictas para los nombres de variables:
- Los nombres pueden contener letras, dígitos,
_(guion bajo) y$(signo de dólar). - Los nombres no deben empezar con un dígito.
- Los nombres son sensibles a mayúsculas y minúsculas —
totalyTotalson variables distintas. - Las palabras clave reservadas como
let,classoreturnno pueden usarse. - No se permiten espacios.
Además de las reglas, sigue estas convenciones para un código legible:
- Usa nombres descriptivos:
userAge, nox. - Usa camelCase para variables y funciones:
firstName,itemCount. - Usa UPPER_SNAKE_CASE para constantes fijas:
const MAX_SIZE = 100;. - Evita letras sueltas excepto para contadores de bucle de corta vida (
i,j).
Resumen
- Usa
constpor defecto,letcuando necesites reasignar, y evitavaren código nuevo. letyconsttienen ámbito de bloque;vartiene ámbito de función y se escapa de los bloques.let/constviven en la TDZ antes de su declaración;varse lee comoundefined.constbloquea la reasignación, no la mutación — el contenido de object y array puede seguir cambiando.- Sigue las reglas de nomenclatura (sin dígito inicial, sin palabras clave, sensible a mayúsculas) y usa camelCase.
Para profundizar, lee El antiguo "var" y Ámbito de variable, closure.