Pular para o conteúdo principal

Questão de Programação — JavaScript — FUNDATEC 2024

ProgramaçãoJavaScript
Código
qg162654
Banca
FUNDATEC
Órgão
Câmara de Venâncio Aires - RS
Ano
2024
Nível
Superior
Cargo
Analista de Tecnologia da Informação
Analise o documento HTML abaixo. Nele consta um trecho de código escrito na linguagem JavaScript:Q50.png 450×216Ao abrir o documento em um navegador, o que será exibido na caixa de alerta que será aberta?
  1. AHello
  2. BOlá
  3. CHelloOlá
  4. Dundefined
  5. Enull
Revelar gabarito e comentário

GabaritoA — Hello

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”.

JavaScript: escopo de variáveis e alert()

Gabarito: letra A. O código exibe "Hello" na caixa de alerta, pois a variável x é declarada com var dentro de um bloco {}, e var não possui escopo de bloco — ela é içada (hoisting) e fica acessível em todo o escopo da função. Como o bloco não cria um novo escopo, a atribuição x = "Hello" sobrescreve o valor anterior, e o alert(x) exibe "Hello".

O JavaScript é uma linguagem de programação interpretada, de tipagem dinâmica e multiparadigma, amplamente utilizada para criar interatividade em páginas web. Uma das características mais importantes — e que costuma gerar confusão — é o escopo das variáveis. Existem três formas de declarar variáveis em JavaScript: var, let e const. Cada uma tem regras diferentes de escopo e de içamento (hoisting).

A declaração com var tem escopo de função, ou seja, a variável é acessível em toda a função onde foi declarada, independentemente de blocos {} como if, for ou blocos soltos. Além disso, var sofre hoisting: a declaração é movida para o topo do escopo, mas a atribuição permanece no lugar. Isso significa que a variável existe antes da linha de declaração, mas com valor undefined até a atribuição.

Já let e const têm escopo de bloco. Elas também sofrem hoisting, mas ficam em uma "zona morta temporal" (temporal dead zone) até a linha de declaração — qualquer tentativa de acesso antes gera erro de referência. Essa diferença é crucial para entender o comportamento do código.

No código da questão, temos algo como:

var x = "Olá";
{
  var x = "Hello";
}
alert(x);

Como var não respeita o escopo de bloco, a segunda declaração var x = "Hello" não cria uma nova variável — ela reatribui o valor da variável x que já existia no escopo da função. Portanto, após o bloco, x vale "Hello", e o alert(x) exibe "Hello".

Se o código usasse let ou const dentro do bloco, aí sim teríamos uma variável separada, e o alert exibiria "Olá". Mas com var, a reatribuição é global ao escopo da função.

A pegadinha da banca está exatamente nessa diferença: muitos candidatos assumem que o bloco {} cria um novo escopo, o que é verdade para let e const, mas não para var. É uma armadilha clássica em questões de JavaScript.

Guarde essa distinção: var = escopo de função; let/const = escopo de bloco. É exatamente nessa fronteira que as alternativas se dividem.

Declaração de variáveis em JS
  • 1var
    • Escopo de função
    • Hoisting (declaração ao topo)
    • Ignora bloco {}
  • 2let / const
    • Escopo de bloco
    • Hoisting + zona morta temporal
    • Respeitam bloco {}
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

A alternativa está correta porque, com var, a variável x declarada dentro do bloco {} é a mesma do escopo externo. A atribuição x = "Hello" sobrescreve o valor anterior, e o alert(x) exibe "Hello". O bloco não cria um novo escopo para var.

Alternativa B — ❌ Incorreta

A alternativa seria correta se a variável dentro do bloco fosse declarada com let ou const, pois aí teríamos uma variável separada e o alert exibiria "Olá". Mas com var, a reatribuição afeta a variável externa, então o valor exibido é "Hello".

Alternativa C — ❌ Incorreta

A alternativa sugere que o alerta exibiria "HelloOlá", o que aconteceria se houvesse uma concatenação de strings, como alert(x + y). No código, porém, há apenas uma variável x que é reatribuída, não concatenada. O valor final é apenas "Hello".

Alternativa D — ❌ Incorreta

A alternativa sugere que o alerta exibiria undefined. Isso aconteceria se a variável x fosse declarada mas nunca atribuída, ou se houvesse hoisting sem atribuição. No código, x é atribuída duas vezes, então nunca fica undefined no momento do alert.

Alternativa E — ❌ Incorreta

A alternativa sugere que o alerta exibiria null. Isso aconteceria se x fosse explicitamente atribuída a null. No código, x recebe strings, nunca null.

NÃO CAIA NESSA!

A banca explora a confusão entre escopo de bloco e escopo de função. Muitos candidatos assumem que o bloco {} isola a variável, o que é verdade para let e const, mas não para var. Com var, a reatribuição dentro do bloco afeta a variável externa. Fique atento: se a declaração for var, o bloco não protege nada; se for let/const, protege.

PEGA ESSA DICA!

Na prova, ao ver um bloco {} com uma variável var, lembre-se: var ignora o bloco. Para testar rapidamente, substitua mentalmente var por let e veja se o resultado muda — se mudar, a questão está cobrando exatamente essa diferença.

Gabarito: letra A

Link permanente: /questoes/qg162654