ES6
introduce le Let
variabili che ne risultano block level scoping
. Fino a ES5
quando non lo avevamo block level scoping
, quindi le variabili dichiarate all'interno di un blocco sono semprehoisted
funzionare a livello di scoping.
Fondamentalmente si Scope
riferisce a dove nel tuo programma sono visibili le tue variabili, che determina dove ti è permesso usare le variabili che hai dichiarato. In ES5
abbiamo global scope,function scope and try/catch scope
, con ES6
otteniamo anche l'ambito scoping a livello di blocco usando Let.
- Quando si definisce una variabile con
var
parola chiave, è nota l'intera funzione dal momento in cui è stata definita.
Quando si definisce una variabile con let
istruzione, è 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 loop
e 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 for
ciclo stampa sempre l' ultimo valore, con let
esso 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 object
ma la object
stessa 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.