V - - Analista de Informática I - Área de Atuação: Desenvolvimento de Sistemas - Edital nº 350
Considere o seguinte código JavaScript dentro de uma
página web.
<script>
let x = 10;
{let x = 15;}
{x = x + 3;}
document.getElementById( output ).innerHTML = x;
</script>
A saída exibida no elemento output após a execução
do script é:
Avazia (em branco)
B3
C10
D13
E18
Revelar gabarito e comentário▾
GabaritoD — 13
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Resolução
Gabarito: letra D — a conta chega a 13 — alternativa D.
A ideia por trás
Em JavaScript, o escopo de uma variável define onde ela pode ser usada. Antes do ES6, a palavra-chave var ignorava blocos de chaves e a variável vazava para a função inteira. Com let e const, a variável fica restrita ao bloco onde foi declarada — um bloco é qualquer trecho entre chaves, como em if, for, while ou um bloco isolado. Isso evita vazamentos, mas cria uma pegadinha: nem todo bloco cria uma nova variável, só se houver uma declaração dentro.
A regra é: declarar (let x = 15) cria uma nova variável no escopo corrente; atribuir (x = x + 3) modifica a variável existente no escopo corrente ou, se não existir, no escopo mais próximo que a contenha. Se um bloco não tem declaração, a atribuição procura a variável para fora do bloco. Por isso, um bloco com apenas uma atribuição não isola nada — ele age sobre a variável externa.
Esta questão testa exatamente essa distinção: o primeiro bloco declara uma nova variável local, o segundo apenas atribui. Perceber que o segundo bloco não tem declaração é o passo decisivo.
O que a questão dá
let x = 10;
{let x = 15;}
{x = x + 3;}
document.getElementById('output').innerHTML = x;
O que queremos: o valor exibido no elemento output após a execução do script
Passo 1 — Ver o valor inicial de x
O script começa declarando x com 10. Esse é o valor de partida que todas as operações seguintes vão usar, então precisamos fixá-lo antes de analisar os blocos.
NÃO CAIA NESSA!
Esquecer que a variável externa começa em 10 e tentar somar 15 + 3 direto.
Passo 2 — Analisar o primeiro bloco
O primeiro bloco tem uma declaração let x = 15. Como let tem escopo de bloco, essa declaração cria uma nova variável que só existe dentro das chaves. Ela não altera a x externa, que continua 10.
x externa continua 10
NÃO CAIA NESSA!
Achar que o primeiro bloco modifica a x externa para 15 — mas a declaração let cria uma variável local, independente.
Passo 3 — Analisar o segundo bloco
O segundo bloco não tem declaração, apenas a atribuição x = x + 3. Como não há let, const ou var, a atribuição não cria uma nova variável — ela procura a x existente no escopo externo, que vale 10, e soma 3.
Por que esta fórmula: A atribuição x = x + 3 lê o valor atual de x (10) e atribui o resultado (13) à mesma variável. É uma atualização, não uma nova declaração.
De onde vem cada valor: = passo 1: 10
NÃO CAIA NESSA!
Pensar que o segundo bloco também cria uma variável local, deixando a externa em 10 — mas sem declaração, a atribuição age na externa.
Passo 4 — Exibir o valor final
A última linha do script coloca o valor de x no elemento output. Como x foi atualizada para 13 no passo anterior, é esse valor que aparece na página.
NÃO CAIA NESSA!
Confundir a ordem: o primeiro bloco não afeta a externa, então não se soma 15 + 3 = 18.