No contexto do JavaScript, considere as seguintes afirmativas sobre a declaração de variáveis com let ou var. I. Variáveis declaradas com let não podem ser redeclaradas no mesmo { } bloco. II. Variáveis declaradas com let podem ser utilizadas em qualquer trecho do código (escopo global). III. Variáveis declaradas com var no interior de um { } bloco podem ser utilizadas fora do bloco de origem. Está correto o que se afirma apenas em
- A)I.
Esta alternativa afirma que somente a afirmativa I está correta, isto é, que o uso de let impede a redeclaração no mesmo bloco. Isso é verdadeiro, porque let tem escopo de bloco e não admite uma segunda declaração com o mesmo identificador dentro do mesmo { }. O problema é que a afirmativa III também está correta, pois var não respeita o limite do bloco e pode ser acessada fora dele.
- B)II.
Aqui se sustenta que apenas a afirmativa II estaria certa, como se let pudesse ser usado livremente em qualquer ponto do código em escopo global. Isso está errado porque let não tem escopo global amplo, mas sim escopo de bloco, ficando restrito ao trecho delimitado por { }. Além disso, I e III descrevem corretamente regras conhecidas do JavaScript, então a opção ignora proposições verdadeiras e mantém apenas uma falsa.
- C)I e II.
Essa opção combina I e II, ou seja, aceita a impossibilidade de redeclarar let no mesmo bloco, mas também diz que let pode ser usado em qualquer trecho do código. A primeira parte procede, mas a segunda contraria a regra de escopo de bloco de let, que não o torna disponível em todo o programa. Ela também deixa de fora a afirmativa III, que está correta porque var é funcional ou global, não blocado.
- D)I e III.
Esta alternativa reúne I e III: reconhece que let não pode ser redeclarado no mesmo bloco e que var, mesmo declarado dentro de um { }, continua acessível fora dele. As duas afirmações correspondem ao comportamento real do JavaScript, em que let tem escopo de bloco e var sofre escopo de função ou global, com hoisting que ignora o bloco. Por isso, esta é a combinação correta.
- E)II e III.
A opção diz que II e III estariam corretas, isto é, que let teria uso irrestrito no código e que var escaparia do bloco onde foi declarado. A parte sobre var está certa, mas a de let está errada, porque let é limitado ao bloco e não pode ser lido em qualquer trecho do programa. Além disso, a afirmativa I também é verdadeira, então a combinação proposta omite uma regra válida e inclui uma falsa.
Gabarito: D
Em JavaScript, a diferença entre let e var costuma cair justamente no jogo de escopo e redeclaração. A let tem escopo de bloco, então o que nasce dentro de um { } fica preso ali, e além disso não pode ser redeclarada no mesmo bloco. Já a var tem escopo de função, não de bloco, o que faz muita gente escorregar na prova. Na afirmativa I, a banca está certa: se você declara uma variável com let no mesmo bloco, não pode sair repetindo o nome como se nada tivesse acontecido. O JavaScript entende isso como erro de redeclaração naquele escopo. Na afirmativa II, a frase está errada porque let não vale em qualquer trecho do código. Ela não cria escopo global livre para uso em todo lugar; ela respeita o bloco em que foi declarada. Se a intenção fosse dizer que uma variável let declarada fora de blocos pode ser acessada globalmente, ainda assim a ideia estaria mal formulada, porque o ponto central é que let não ignora escopo. Na afirmativa III, a banca está certa: var dentro de um bloco não fica limitada a esse bloco, pois o seu escopo não é de bloco, e sim de função. Por isso ela pode ser acessada fora do { } em que apareceu. Em prova, pense assim: let prende no bloco; var escapa do bloco.