He escuchado que el acceso let
y los const
valores antes de que se inicialicen pueden causar algo ReferenceError
debido a la llamada 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?
javascript
ecmascript-6
const
let
joews
fuente
fuente
Respuestas:
let
yconst
tienen dos grandes diferencias devar
:var
antes de que se declare tiene el resultadoundefined
; el acceso a unalet
oconst
antes de que sea declarada lanzaReferenceError
:A partir de estos ejemplos, parece que las
let
declaraciones (yconst
, que funcionan de la misma manera) no se pueden izar , ya queaLet
que no parece existir antes de que se le asigne un valor.Sin embargo, ese no es el caso,
let
yconst
se izan (comovar
,class
yfunction
), pero hay un período entre el ingreso al alcance y la declaración donde no se puede acceder. Este período es la zona muerta temporal (TDZ) .El TDZ finaliza cuando
aLet
se declara , en lugar de asignarse :Este ejemplo muestra que
let
se iza:Crédito: Temporal Dead Zone (TDZ) desmitificado
Acceder
x
en el ámbito interno todavía causa aReferenceError
. Silet
no se izara, se registraríaouter 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:
El TDZ no está habilitado por defecto en el transpilador babel.js. Active el modo "alto cumplimiento" para usarlo en REPL . Proporcione la
es6.spec.blockScoping
bandera para usarla con la CLI o como biblioteca.Lecturas recomendadas adicionales: TDZ desmitificado y ES6 Let, Const y la "Temporal Dead Zone" (TDZ) en profundidad .
fuente
let foo
en un bloque hace que se levante y se declare en la parte superior de ese bloque. La línea delet foo
hace que se inicialice. Yfoo = xyz
hace que se le asigne un valor.Izado:
let
,const
,var
son todos procesos izada a conseguir.(lo que significa que suben y declaran en la parte superior del alcance).
Inicialización
var
pasar también por el proceso inicial y obtener el valor inicial deundefined
.let
,const
no se lanzó el proceso inicial, por lo que sus valores aún son inaccesibles, aunque ya lo declararon. en qué los colocastemporal dead zone
Entonces en breve:
fuente
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.
el código anterior da un error
el mismo código no dará un error cuando usamos var para la variable 'a',
ex.
fuente
undefined
y5
). La declaración devar a
es izada, el código de inicialización establecidoa
en 5 no lo es.