lete consthanno due grandi differenze rispetto a var:
- Sono con ambito di blocco .
- Accedere a
varprima che venga dichiarato ha il risultato undefined; accedendo a leto constprima che venga dichiarato lancio ReferenceError:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
Da questi esempi risulta che le letdichiarazioni (e constche funzionano allo stesso modo) non possono essere sollevate , poiché aLetnon sembrano esistere prima che gli venga assegnato un valore.
Questo non è il caso, tuttavia- lete const sono issato (come var, classe function), ma v'è un periodo tra un'entrata portata e di essere dichiarato in cui non è possibile accedere. Questo periodo è la zona morta temporale (TDZ) .
Il TDZ termina quando aLetviene dichiarato , anziché assegnato :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Questo esempio mostra che letè stato sollevato:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Ringraziamento: Temporal Dead Zone (TDZ) demistificato
L'accesso xnell'ambito interno causa ancora a ReferenceError. Se letnon fosse stato sollevato, si registrava outer value.
Il TDZ è positivo perché aiuta a evidenziare i bug: l'accesso a un valore prima che sia stato dichiarato è raramente intenzionale.
Il TDZ si applica anche agli argomenti di funzione predefiniti. Gli argomenti vengono valutati da sinistra a destra e ogni argomento si trova nel TDZ fino a quando non viene assegnato:
// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.
TDZ non è abilitato per impostazione predefinita nel transpiler babel.js. Attiva la modalità "alta conformità" per utilizzarlo nella REPL . Fornire il es6.spec.blockScopingflag per usarlo con l'interfaccia della riga di comando o come libreria.
Ulteriori letture consigliate: TDZ demistificato e ES6 Let, Const e la "Zona morta temporale" (TDZ) in profondità .