Questão nº 54

Questão de Tecnologia da Informação · FGV BANESTES 2021 (nº 54)

FGV2021Analista em Tecnologia da Informação - Desenvolvimento de SistemasTecnologia da Informação
Gabarito: Cver comentário ↓

Analise o script JS a seguir.

<script>
function xpto() {
  let n = 0;
  return {next:
          function()
          {
            if (n < 10) {
              n += 2;
              return {value:n/2, done:false}}
            else {
             return {value: -1, done: true}}
          }
  }
}
saida = ""
const n = xpto();
x = n.next();
while (x.done == false) {
  saida += x.value + "/";
  x = n.next();
}
alert(saida);
</script>

O resultado da execução desse código é:

Resposta comentada

Gabarito Alternativa C

Closures em JavaScript permitem que uma função interna "lembre" e acesse variáveis do seu escopo externo, mesmo depois que a função externa já terminou de executar, mantendo o estado dessas variáveis entre chamadas.

  • (A) Incorreta: Os valores gerados são positivos e crescentes, não negativos e decrescentes.
  • (B) Incorreta: A variável n é incrementada (n += 2) antes de ser usada para calcular value. O primeiro n é 0, mas na primeira chamada a n.next(), ele se torna 2, resultando em value = 2/2 = 1. A armadilha aqui é pensar que o valor inicial de n (0) seria usado na primeira iteração, ou que 0/2 seria o primeiro valor.
  • (C) Correta: O código implementa um iterador usando uma closure. A variável n mantém seu estado entre as chamadas ao método next().
    • 1ª chamada a n.next(): n (que era 0) vira 2. Retorna {value: 1, done: false}. saida = "1/".
    • 2ª chamada a n.next(): n (que era 2) vira 4. Retorna {value: 2, done: false}. saida = "1/2/".
    • 3ª chamada a n.next(): n (que era 4) vira 6. Retorna {value: 3, done: false}. saida = "1/2/3/".
    • 4ª chamada a n.next(): n (que era 6) vira 8. Retorna {value: 4, done: false}. saida = "1/2/3/4/".
    • 5ª chamada a n.next(): n (que era 8) vira 10. Retorna {value: 5, done: false}. saida = "1/2/3/4/5/".
    • 6ª chamada a n.next(): n (que era 10) não é mais menor que 10. Retorna {value: -1, done: true}. O loop while termina.
      O alert exibe "1/2/3/4/5/".
  • (D) Incorreta: Os valores gerados são crescentes, não decrescentes.
  • (E) Incorreta: Os valores gerados são crescentes e o loop termina antes de gerar um 0.

Fonte: FGV BANESTES 2021 Analista em Tecnologia da Informação - Desenvolvimento de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho