ES6introduce le Letvariabili che ne risultano block level scoping. Fino a ES5quando non lo avevamo block level scoping, quindi le variabili dichiarate all'interno di un blocco sono semprehoisted funzionare a livello di scoping.
Fondamentalmente si Scoperiferisce a dove nel tuo programma sono visibili le tue variabili, che determina dove ti è permesso usare le variabili che hai dichiarato. In ES5abbiamo global scope,function scope and try/catch scope, con ES6otteniamo anche l'ambito scoping a livello di blocco usando Let.
- Quando si definisce una variabile con
varparola chiave, è nota l'intera funzione dal momento in cui è stata definita.
Quando si definisce una variabile con letistruzione, è nota solo nel blocco in cui è definita.
function doSomething(arr){
//i is known here but undefined
//j is not known here
console.log(i);
console.log(j);
for(var i=0; i<arr.length; i++){
//i is known here
}
//i is known here
//j is not known here
console.log(i);
console.log(j);
for(let j=0; j<arr.length; j++){
//j is known here
}
//i is known here
//j is not known here
console.log(i);
console.log(j);
}
doSomething(["Thalaivar", "Vinoth", "Kabali", "Dinesh"]);
Se esegui il codice, potresti vedere che la variabile jè nota solo nel loope non prima e dopo. Tuttavia, la nostra variabile iè nota inentire function dal momento in cui è definita in poi.
C'è un altro grande vantaggio nell'usare let in quanto crea un nuovo ambiente lessicale e lega anche un nuovo valore piuttosto che mantenere un vecchio riferimento.
for(var i=1; i<6; i++){
setTimeout(function(){
console.log(i);
},1000)
}
for(let i=1; i<6; i++){
setTimeout(function(){
console.log(i);
},1000)
}
Il primo forciclo stampa sempre l' ultimo valore, con letesso crea un nuovo ambito e lega nuovi valori stampandoci 1, 2, 3, 4, 5.
Venendo a constants, funziona praticamente come let, l'unica differenza è che il loro valore non può essere modificato. Nelle costanti è consentita la mutazione ma non è consentita la riassegnazione.
const foo = {};
foo.bar = 42;
console.log(foo.bar); //works
const name = []
name.push("Vinoth");
console.log(name); //works
const age = 100;
age = 20; //Throws Uncaught TypeError: Assignment to constant variable.
console.log(age);
Se una costante si riferisce a una object, farà sempre riferimento a objectma la objectstessa può essere modificata (se è mutabile). Se ti piace avere un immutabile object, potresti usarloObject.freeze([])
let foo = () => bar; let bar = 'bar'; foo();illustri ancora meglio l'effetto di tutte le dichiarazioni , perché non è ovvio a causa della zona morta temporale.