Médio JavaScript
Temporal Dead Zone na prática
Enunciado
Explique e demonstre o comportamento da Temporal Dead Zone (TDZ) com let. Crie uma função que tenta acessar uma variável antes da declaração, capture o erro e imprima uma mensagem explicativa.
Requisitos
- A função deve tentar acessar
valorantes da declaração comlet. - O erro deve ser capturado com
try/catch. - A mensagem impressa deve ser:
Erro: Cannot access 'valor' before initialization. - Após o bloco
try/catch, a variável deve ser declarada e seu valor impresso.
Código inicial
function demonstrarTDZ() {
// seu código aqui
}
demonstrarTDZ();
Saída esperada
Erro: Cannot access 'valor' before initialization
Valor após declaração: 42
Ver dica
Use try { console.log(valor); } catch (e) { ... } e depois declare let valor = 42;.
Mostrar solução
function demonstrarTDZ() {
try {
console.log(valor); // TDZ: acesso antes da declaração
} catch (erro) {
console.log(`Erro: ${erro.message}`);
}
let valor = 42; // declaração após o try/catch
console.log(`Valor após declaração: ${valor}`);
}
demonstrarTDZ();
Passo a passo
- A função
demonstrarTDZé criada. - Dentro do
try, tentamos acessarvalorantes de sua declaração. - Como
valoré declarada comletmais abaixo, ocorre umReferenceError. - O
catchcaptura o erro e imprime a mensagem exata. - Depois do bloco, declaramos
let valor = 42e imprimimos seu valor.
Por que funciona
A TDZ é o período entre o início do escopo e a linha da declaração da variável. Durante esse período, a variável existe mas não pode ser acessada. O try/catch captura o erro e permite continuar a execução.
Erros comuns
- Usar
varem vez delet:varé hoisted e inicializada comundefined, então não gera erro, mas imprimeundefined. - Não capturar o erro: o programa quebra e não executa o resto.
- Declarar
valordentro dotry: a TDZ não seria demonstrada corretamente.
Outra forma de resolver
Poderia usar console.log fora do try e deixar o erro quebrar o programa, mas isso não é didático. A captura com try/catch é a melhor forma de observar o comportamento.
Saída esperada
Erro: Cannot access 'valor' before initialization
Valor após declaração: 42