let
e const
hanno due grandi differenze rispetto a var
:
- Sono con ambito di blocco .
- Accedere a
var
prima che venga dichiarato ha il risultato undefined
; accedendo a let
o const
prima 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 let
dichiarazioni (e const
che funzionano allo stesso modo) non possono essere sollevate , poiché aLet
non sembrano esistere prima che gli venga assegnato un valore.
Questo non è il caso, tuttavia- let
e const
sono issato (come var
, class
e 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 aLet
viene 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 x
nell'ambito interno causa ancora a ReferenceError
. Se let
non 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.blockScoping
flag 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à .