let, var y const - El Mundo de Angular

let, var y const

Había una vez tres bandos en el mundo Typescript: var, let y const. Los de la banda de var eran los más rebeldes, esos a los que no les gustaba seguir las reglas y no querían límites, si les decían que se quedaran en un lugar ellos traspasaban ese límite y se iban para otro lado, porque les gustaba ser libres. Por otro lado, los integrantes de la banda de let no eran tan rebeldes como los de var, si a ellos les decías que se quedaran en un lugar, se quedaban. Por último, estaba la banda de los const, que eran los más inflexibles de todos, ellos no sólo se quedaban en el lugar que les decías, sino que además, una vez que se les metía algo en la cabeza, no había forma de hacerlos cambiar de opinión.

La banda de los var

«var» es una palabra reservada de Typescript para declarar variables (o sea, para crearla por primera vez). El scope (o alcance) de las variables declaradas con var es a nivel de Execution Context 

 

Todas las variables que son creadas usando var tienen un alcance a nivel del Execution Context. Ya sea el Execution Context la función donde se crean, o el Execution Context Global, o sea, la función principal. Esto es tan así, que no importa en qué lugar se declare una variable, su scope será el mismo.

Esto quiere decir que éste código:


var miVar = 'hola';
console.log('miVar', miVar);

Y este otro codigo


if(true) {
    var i:number;
    i=1;
    console.log('valor i dentro del if', i);
}
console.log('valor de i fuera del if', i);

Compilan, y aunque no hacen lo mismo, ambos bloques de codigo son validos ¡Exacto, no tienen errores! Cuando usas var, se puede definir una variable tanto dentro como fuera de un bloque if, for o while y esa variable sera valida tanto dentro como fuera de ese bloque.

O sea, si declaramos una variable con var dentro de un bloque de código if, for o while



if(true) {
    var i:number;
    i=1;
    console.log('valor i dentro del if', i);
}
console.log('valor de i fuera del if', i);


Adiviná qué pasa… Exactooo la variable «i» es válida tanto dentro del bloque if como fuera de este

El problema de var es que su scope va más allá del bloque (un if, where, for) donde se lo declare, este problema no sólo se encuentra en este ejemplo, sino en ejemplos más complejos como éste, por eso … ¡hay que tener cuidado!.

El bando de los let

Para salvar este problema existe “let”, que sirve para definir variables e indicarles que su scope es el de bloque.

De esta forma, podemos cambiar el código por el siguiente:


if (true) {
    let i:number;
    i=1;
    console.log('valor i dentro del if', i);
}
console.log('valor de i fuera del if', i); //esto tira un error de compilación

Si te fijás bien,  este código es exactamente igual al otro, con la diferencia que usamos la keyword let  en lugar de la keyword var.  De esta forma, el scope de la variable i queda dentro del bloque if.

 

let permite declarar variables limitando su alcance (scope) al bloque, declaración, o expresión donde se está usando.

 

Es más, se recomienda usar let en vez de var, ya que con let se evitan errores de scope difíciles de detectar. la palabra reservada var sólo está en Typescript por cuestiones de compatibilidad.

 

La banda de los const

const es una palabra reservada que declara un valor que no se puede modificar una vez definido, y además su scope es de bloque.

O sea, es como let pero sólo se le puede asignar un valor una vez, si quisiéramos hacer ésto:


const variableConstante = 'Hola';
variableConstante = 'chan'; //esto nos daría un error

 

const, al igual que let, permite declarar variables limitando su alcance (scope) al bloque, declaración, o expresión donde se está usando y además no permite que la referencia a una variable sea modificada.

 

Cabe aclarar que no significa que el valor sea inmutable, sino su referencia, o sea, no se puede reasignar una variable pero sí se podrá cambiar su contenido, como es el caso de los objetos.

Por otra parte, sí podemos hacer lo siguiente,  ya que el scope de const es de bloque:


const constante = 'hola';
if (true) {
    const constante = 'chau';
    console.log('constante en bloque', constante);
}
console.log('constante fuera', constante);

Así que, tené cuidado cuando definís una constante, no definas constantes por todos lados ya qué podés repetir la constante con un valor diferente.

¿Y cuando definimos objetos?

Cuando definimos objetos pasa algo distinto, si bien el objeto  no puede modificarse, es inmutable, sí pueden modificarse sus propiedades, como se ve en el siguiente ejemplo:


cost miObjeto = {
    nombre:'Gustavo'
}

lo que es inmutable, o no se puede modificar, es la variable miObjeto, pero lo que está DENTRO del objeto sigue siendo modificable.


// correcto
miObjeto.nombre = 'Hernan';
// incorrecto
miObjeto = {
    nombre: 'Hernan'
}

Conclusión

Como el bando de los var  era tan rebelde, el mundo de Typescript  empezó a recomendar que no se juntaran con ellos,  sino que sólo lo hagan con let y const,  pero claro,  siempre están los osados a los que les gusta romper reglas, ¡mucho cuidado si se llegan a juntar con estos muchachos, los var! ;)

 

About the Author

Mi nombre es Gustavo Hernán Dohara, soy Ingeniero en Sistemas y, sobre todas las cosas, soy un apasionado por la tecnología; tengo más de 10 años de experiencia en diferentes tecnologías y he decidido compartir mis conocimientos y experiencias con cualquiera que desee aprender: alumnos, empleados, freelancers y vos. Al ritmo que cada uno pueda, en el horario en que cada uno pueda y en el lugar que cada uno elija.