lety consttienen dos grandes diferencias de var:
- Tienen un alcance de bloque .
- Acceder a un
varantes de que se declare tiene el resultado undefined; el acceso a una leto constantes de que sea declarada lanza ReferenceError:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
A partir de estos ejemplos, parece que las letdeclaraciones (y const, que funcionan de la misma manera) no se pueden izar , ya queaLet que no parece existir antes de que se le asigne un valor.
Sin embargo, ese no es el caso, lety const se izan (como var, classy function), pero hay un período entre el ingreso al alcance y la declaración donde no se puede acceder. Este período es la zona muerta temporal (TDZ) .
El TDZ finaliza cuando aLetse declara , en lugar de asignarse :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Este ejemplo muestra que letse iza:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Crédito: Temporal Dead Zone (TDZ) desmitificado
Acceder xen el ámbito interno todavía causa a ReferenceError. Si letno se izara, se registraría outer value.
El TDZ es bueno porque ayuda a resaltar errores: el acceso a un valor antes de que se haya declarado rara vez es intencional.
La TDZ también se aplica a los argumentos de función predeterminados. Los argumentos se evalúan de izquierda a derecha, y cada argumento está en la TDZ hasta que se asigna:
// 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.
El TDZ no está habilitado por defecto en el transpilador babel.js. Active el modo "alto cumplimiento" para usarlo en REPL . Proporcione la es6.spec.blockScopingbandera para usarla con la CLI o como biblioteca.
Lecturas recomendadas adicionales: TDZ desmitificado y ES6 Let, Const y la "Temporal Dead Zone" (TDZ) en profundidad .