javascript - style - title html




¿Cuál es la zona muerta temporal? (2)

En el caso de las variables let y const, Básicamente, Temporal Dead Zone es una zona

"antes de que se declare tu variable",

es decir, donde no puede acceder al valor de estas variables, arrojará un error.

ex.

let sum = a + 5;        //---------
//some other code       //         | ------>  this is TDZ for variable a
                        //         |
console.log(sum)        //---------
let a = 5;

el código anterior da un error

el mismo código no dará un error cuando usamos var para la variable 'a',

ex.

var sum = a;                            
console.log(sum)     //prints undefined
var a = 5;

He oído que acceder let valores let y const antes de que se inicialicen puede causar un ReferenceError de ReferenceError debido a algo llamado zona muerta temporal .

¿Cuál es la zona muerta temporal, cómo se relaciona con el alcance y la elevación, y en qué situaciones se encuentra?


let y const tienen dos grandes diferencias con respecto a var :

  1. Son de ámbito de bloque .
  2. Acceder a una 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;

A partir de estos ejemplos, parece que las declaraciones (y const , que funcionan de la misma manera) no se pueden hoisted , ya que aLet 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 ámbito y la declaración de que no se puede acceder a ellos. Este período es la zona muerta temporal (TDZ) .

El TDZ finaliza cuando se declara aLet , 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 es izado:

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 fuera izado, 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 el indicador es6.spec.blockScoping para usarlo con la CLI o como biblioteca.

Lecturas adicionales recomendadas: TDZ desmitificado y ES6 Let, Const y la “Zona muerta temporal” (TDZ) en profundidad .





let