var vs let
La principal diferència entre var i let en JavaScript rau en el seu abast (scope) i en si permeten la redeclaració. let es va introduir a ECMAScript 2015 (ES6) per a solucionar alguns problemes d'abast de var.
Diferència Principal: Abast (Scope)
Qué és l'Abast?
Abast de funció (var): Una variable declarada amb var és accessible en qualsevol lloc dins de la funció on ha estat declarada, ignorat els blocs com if o for.
function exempleVar() {
if (true) {
var x = 10;
}
console.log(x); // Sortida: 10 (Encara accessible fora del bloc `if`)
}
Abast de bloc (let): Una variable declarada amb let només és accessible dins del bloc de codi on ha estat declarada (un bloc és qualsevol codi dins de claus {}). Això inclou bucles (for), condicionals (if), i funcions.
function exempleLet() {
if (true) {
let y = 20;
}
// console.log(y); // Error: ReferenceError: y is not defined (No accessible fora del bloc `if`)
}
Que és el hoisting?
Hoisting/elevació (var): La declaració s'eleva al capdamunt del seu àmbit, però la inicialització es manté on es va escriure. Per això, si intentes utilitzar una variable var abans de declarar-la, el seu valor serà undefined.
console.log(color); // undefined
var color = "blau";
Hoisting/elevació (let): La declaració també s'eleva, però no s'inicialitza. Si intentes accedir a una variable let abans de declarar-la, obtindràs un ReferenceError. A l'espai entre l'elevació i la declaració se l'anomena Zona Morta Temporal (Temporal Dead Zone - TDZ).
// console.log(forma); // ReferenceError: No es pot accedir a 'forma' abans de la inicialització
let forma = "cercle";
Avantatges i Inconvenients
var
let
Recomanacions
Avui en dia, la millor pràctica és evitar var i utilitzar principalment let (per a variables que es reassignaran) i const (per a valors constants).
- let (Ús Modern i Recomanat)
- Qualsevol variable local que necessiti ser reassignada (canviada de valor).
- Variables dins de blocs condicionals (if/else) o blocs de funció.
- Comptadors en bucles (for loop), ja que ofereix un abast de bloc, evitant que la variable comptadora "contamini" l'abast exterior.
for (let i = 0; i < 5; i++) { // i només existeix aquí dins } // console.log(i); // Error
- var (Casos d'Ús Heretats)
- Codi antic: Si es treballa amb codi JavaScript heretat o es manté una base de codi antiga.
- Entorns molt restringits: En entorns on la compatibilitat amb versions molt antigues de JavaScript és obligatòria. (Molt poc freqüent avui dia).