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
:
- Son de ámbito de bloque .
-
Acceder a una
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;
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 deundefined
.
-
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 entemporal dead zone
Entonces en breve:
proceso de elevación:
var
,let
,const
Proceso de inicialización:var