Ouvi dizer que acessar let
e const
valores antes de serem inicializados podem causar um ReferenceError
por causa de algo chamado zona morta temporal .
O que é a zona morta temporal, como ela se relaciona ao escopo e ao içamento e em que situações é encontrada?
javascript
ecmascript-6
const
let
joews
fonte
fonte
Respostas:
let
econst
tem duas grandes diferenças entrevar
:var
antes de ser declarado tem o resultadoundefined
; acessar umlet
ouconst
antes de ser declarado lançaReferenceError
:Parece a partir desses exemplos que as
let
declarações (econst
, que funcionam da mesma maneira) não podem ser hasteadas , poisaLet
não parecem existir antes de receber um valor.Isso não é o caso, no entanto-
let
econst
são içadas (comovar
,class
efunction
), mas há um período entre uma entrada escopo e ser declarado onde eles não podem ser acessados. Este período é a zona morta temporal (TDZ) .O TDZ termina quando
aLet
é declarado , em vez de atribuído :Este exemplo mostra que
let
é içado:Crédito: Zona morta temporal (TDZ) desmistificada
O acesso
x
no escopo interno ainda causa aReferenceError
. Selet
não fosse içado, seria registradoouter value
.O TDZ é uma coisa boa porque ajuda a destacar erros - acessar um valor antes que ele seja declarado raramente é intencional.
O TDZ também se aplica a argumentos de função padrão. Os argumentos são avaliados da esquerda para a direita e cada argumento está no TDZ até que seja designado:
O TDZ não está ativado por padrão no transpiler babel.js. Ative o modo "alta conformidade" para usá-lo no REPL . Forneça o
es6.spec.blockScoping
sinalizador para usá-lo com a CLI ou como uma biblioteca.Leitura adicional recomendada: TDZ desmistificado e ES6 Let, Const e a "Zona morta temporal" (TDZ) em profundidade .
fonte
let foo
em um bloco faz com que seja içado e declarado na parte superior desse bloco. A linha delet foo
causa que ele seja inicializado. Efoo = xyz
faz com que seja atribuído um valor.Içar:
let
,const
,var
estão todos processo içada get.(o que significa que eles vão para o topo e são declarados no topo do escopo.)
Inicialização:
var
passar também pelo processo inicial e obter o valor inicial deundefined
.let
,const
não vai jogar o processo inicial, de modo que seus valores ainda são inacessíveis, embora eles já declarados. o que os colocoutemporal dead zone
Então, em breve:
fonte
No caso de variáveis let e const, Basicamente, Zona Mortal Temporal é uma zona
"antes que sua variável seja declarada",
ou seja, onde você não pode acessar o valor dessas variáveis, isso gera um erro.
ex.
código acima dá um erro
o mesmo código não dará erro quando usamos var para a variável 'a',
ex.
fonte
undefined
e5
). A declaração devar a
é içada, o código de inifialização configuradoa
para 5 não é.