style change attribute javascript ecmascript-6 const let

javascript - change - ¿Cuál es la zona muerta temporal?



title css (3)

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?


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;


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 .


Elevación:
let , const , var son todos procesos de elevación.
(lo que significa que van más alto y declaran en la parte superior del alcance).

Inicialización

  • var también pasa por el proceso inicial y obtiene el valor inicial de undefined .
  • mientras que let , const no fue a lanzar el proceso inicial, por lo que sus valores aún son inaccesibles, aunque ya declararon. ¿Qué los pone en temporal dead zone

Entonces en breve:

proceso de elevación: var , let , const
Proceso de inicialización: var