let
y const
tienen dos grandes diferencias de var
:
- Tienen un alcance de bloque .
- Acceder a un
var
antes de que se declare tiene el resultado undefined
; el acceso a una let
o const
antes 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 let
declaraciones (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, let
y const
se izan (como var
, class
y 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 aLet
se 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 let
se 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 x
en el ámbito interno todavía causa a ReferenceError
. Si let
no 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.blockScoping
bandera 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 .