¿Qué es la zona muerta temporal?
He oído que acceder a los valores let
y const
antes de que se declaren puede causar un ReferenceError
debido a algo llamado zona muerta temporal.
¿Qué es la zona muerta temporal, cómo se relaciona con el alcance y la elevación, y en qué situaciones se encuentra?
1 answers
let
y const
tienen dos grandes diferencias de var
:
- Son con ámbito de bloque.
- Acceder a un
var
antes de que se declare tiene el resultadoundefined
; acceder a unlet
oconst
antes de que se declare arrojaReferenceError
:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
Se desprende de estos ejemplos que let
las declaraciones (y const
, que funciona de la misma manera) no pueden ser izadas, ya que aLet
no parece existir antes de que se le asigne un valor.
Ese no es el caso, sin embargo - let
y const
son izados (como var
, class
y function
), pero hay un período entre entrar en el ámbito y ser declarado donde no se puede acceder a ellos. Este período es la zona muerta temporal (TDZ).
El TDZ termina cuando aLet
es declarado en lugar de asignado:
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Este ejemplo muestra que let
es izada:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Crédito: Zona Muerta Temporal (TDZ) desmitificada
Acceder a x
en el ámbito interno todavía causa un ReferenceError
. Si let
no se izara, se registraría outer value
.
El TDZ es algo bueno porque ayuda a resaltar errores-acceder a un valor antes de que haya sido declarado rara vez es intencional.
El TDZ también se aplica a los argumentos de función predeterminados. Los argumentos se evalúan de izquierda a derecha, y cada argumento es en la TDZ hasta que se le asigne:
// 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 babel .js transpiler. Active el modo "alta conformidad" para usarlo en el REPL . Proporcione el indicador es6.spec.blockScoping
para usarlo con la CLI o como biblioteca.
Lectura adicional recomendada: TDZ desmitificadoy ES6 Let, Const y la "Zona Muerta Temporal" (TDZ) en Profundidad.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-09 15:08:13