En JavaScript, las variables se declaran con la palabra reservada let, mientras que las constantes se declaran con const, una práctica incorporada en ECMAScript 6 (ES6 o ES2015). Antes de esta versión se utilizaba var, que aún funciona en la actualidad, pero su uso ya no se recomienda.
Este artículo permite entender el código antiguo que todavía utiliza var.
Para conocer la forma moderna de declarar variables y constantes, se puede consultar los artículos sobre variables y constantes, respectivamente.
La palabra clave var apareció como parte de la primera versión de ECMAScript 1, en 1997. Su funcionamiento es bastante similar al de let, así que en muchos casos podríamos sustituir una por la otra (var por let) o viceversa —aunque no es lo recomendable— y esperar el mismo funcionamiento.
Sin embargo, el funcionamiento interno de var es diferente, con errores propios de cuando se implementaron sus algoritmos. Es por esta razón que en código moderno ya no se utiliza, pero aún la vemos en programas antiguos.
Conocer var nos permitirá adaptar código antiguo de manera eficiente. Además, conocer las diferentes entre var, let y const nos ayudará a evitar errores extraños o conseguir un código coherente y funcional.
Declarar variables con ‘var’
La declaración de una variable con var implica la creación de un espacio de memoria con un nombre asignado, que permite tanto almacenar datos como modificarlos más tarde. En esto, var se parece a let.
Su sintaxis básica es la siguiente:
var nombre;
Por ejemplo:
var web = 'Recursivos'
A primera vista, esta declaración parece natural e incluso obvia: «var» es la abreviatura de «variable» y cumple con la idea de asignar un valor. Sin embargo, detrás de esta aparente simplicidad se esconden particularidades que pueden generar comportamientos inesperados en el código.
Declaraciones duplicadas
Uno de los problemas de var es que tolera la duplicidad en las declaraciones, es decir, que podemos declarar la misma variable —usando el mismo identificador— múltiples veces. Esto significa que var ignora las primeras declaraciones y solo utiliza la última. Usando let, el resultado sería un error.
Por ejemplo:
var valor = 55;
var valor = 89;
En este ejemplo, se ignorará la primera declaración: el resultado será 89.
El hecho de tener dos declaraciones puede ser problemático durante la lectura o revisión del código, lo que dificulta el mantenimiento. Lo esperable es que devuelva un error, tal y como sucede con la sintaxis moderna: let y const.
Ámbito (scope) de ‘var’
Las variables declaradas con var tienen ámbito (scope) de función, aunque también pueden ser globales si se declaran fuera de una función. Esto implica que su visibilidad atraviesa los bloques, como puede ser un condicional if o un bucle for. Este comportamiento es muy diferente al de otros lenguajes.
function ejemplo() {
if (true) {
var m = 200;
console.log(m); // 200
}
console.log(m); // 200
}
ejemplo();
En este ejemplo, la variable m se declara dentro del if, pero como está dentro de una función, es accesible también desde fuera del condicional.
Este comportamiento de var se debe a que, en las primeras versiones de JavaScript, los bloques no tenían ámbitos léxicos como sí sucede hoy en día, en las versiones modernas. Por tanto, la capacidad de “atravesar” los bloques es un remanente de las etapas iniciales del lenguaje.
El hoisting con ‘var’
Antes de que se ejecute el código, todas las variables son elevadas al inicio de su ámbito. Este proceso se llama hoisting (elevación). Pero si las variables han sido declaras con var, el comportamiento cambia respecto a let y const.
En el caso de var, la variable no solo se eleva, sino que también se inicializa automáticamente con el valor undefined. Esto permite usarla antes de su declaración, aunque el resultado no será el esperado.
En cambio, con let y const, las variables también se elevan, pero no se inicializan. En estos casos, permanecen en la Temporal Dead Zone (TDZ) hasta que el flujo del programa alcanza la línea de su declaración, así que cualquier intento de acceder a ellas antes de ese momento genera un error.
Comparativa con ‘let’ y ‘const’
Las diferencias principales entre var y let/const se resumen básicamente en el ámbito, el hoisting y la duplicidad de las declaraciones.
Resumen comparativo:
| Palabra clave | var | let | const |
|---|---|---|---|
| Ámbito | Función | Bloque | Bloque |
| Hoisting | Inicializa en undefined | TDZ | TDZ |
| Reasignación | Sí | Sí | No |
| Redeclaración | Sí | No | No |
Todas estas diferencias hacen que var sea menos recomendable. En la práctica, las variables con let y las constantes (const), que tienen ámbito de bloque, ofrecen un comportamiento mucho más seguro y predecible.
En conclusión, aunque todavía es posible declarar variables con var, lo recomendable hoy en día es usar let y const. Su permanencia en el lenguaje responde únicamente a razones de compatibilidad con código antiguo.