¿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?

Author: Michał Perłakowski, 2015-10-18

1 answers

let y const tienen dos grandes diferencias de var:

  1. Son con ámbito de bloque.
  2. Acceder a un var antes de que se declare tiene el resultado undefined; acceder a un let o const antes de que se declare arroja ReferenceError:

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.

 137
Author: joews,
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