Considere o código Javascript exibido a seguir. <script> var x = 10; { var x = 2; } alert( x); </script> A execução desse script provoca
- A)a exibição do valor 10.
Errada, porque o var dentro do bloco altera a mesma variável já declarada, então o valor final não permanece 10.
- B)a exibição do valor 12.
Errada, porque não há soma nem concatenação entre 10 e 2; ocorre apenas reatribuição do valor da variável.
- C)a exibição do valor 2.
Certa, porque var não cria escopo de bloco e o x é reatribuído para 2 antes do alert.
- D)um erro de execução.
Errada, porque o código é sintaticamente válido e executa normalmente no JavaScript.
- E)um erro de sintaxe.
Errada, porque a estrutura do script está correta e não há erro de sintaxe na declaração nem no bloco.
Gabarito: C
Em JavaScript, a palavra-chave var não respeita escopo de bloco como acontece com let e const. Ou seja, quando você escreve var dentro de um bloco entre chaves, essa variável continua sendo a mesma variável da função ou do escopo global, sem criar uma nova versão só para o bloco. Resultado: o segundo var x = 2 não cria outro x, ele apenas reatribui o x já existente. No código da questão, primeiro x recebe 10. Depois, dentro do bloco, x é atribuído a 2 usando novamente var. Como var tem escopo de função/global e sofre hoisting, o valor final de x ao chegar no alert é 2. Nada de mágica, nada de erro: o bloco não protege a variável como muita gente imagina. Por isso o gabarito C está correto: o script exibe 2. Se a questão tivesse usado let x = 2 dentro do bloco, aí sim haveria outra variável restrita ao bloco, e o comportamento poderia ser diferente. Mas com var, a regra é essa: blocos não criam escopo novo para ela.