Questão de Programação — JavaScript — FUNDATEC 2024
Programação›JavaScript
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:Ao abrir o documento em um navegador, o que será exibido na caixa de alerta que será aberta?
AHello
BOlá
CHelloOlá
Dundefined
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.