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 valor antes da declaração com let.
  • 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

  1. A função demonstrarTDZ é criada.
  2. Dentro do try, tentamos acessar valor antes de sua declaração.
  3. Como valor é declarada com let mais abaixo, ocorre um ReferenceError.
  4. O catch captura o erro e imprime a mensagem exata.
  5. Depois do bloco, declaramos let valor = 42 e 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 var em vez de let: var é hoisted e inicializada com undefined, então não gera erro, mas imprime undefined.
  • Não capturar o erro: o programa quebra e não executa o resto.
  • Declarar valor dentro do try: 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