Pular para o conteúdo principal

Questão de Programação — JavaScript — FGV 2023

ProgramaçãoJavaScript
Código
fg061583
Banca
FGV
Órgão
Câmara dos Deputados
Ano
2023
Nível
Superior
Cargo
Analista Legislativo - Informática Legislativa - Tarde
Considere o script JavaScript a seguir.Imagem associada para resolução da questãoAssinale os valores exibidos na execução do script acima, na ordem.
  1. Afunction f(f) { return (f*f); } 10000 10000
  2. Bfunction f(f) { return (f*f); }10000undefined
  3. Cundefined10000undefined
  4. D10000
  5. Eundefinedundefinedundefined
Revelar gabarito e comentário

GabaritoA — function f(f) { return (f*f); } 10000 10000

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: Funções como valores e hoisting

Gabarito: letra A. O script exibe, na ordem: a própria definição da função f (porque value1 recebe a função sem invocá-la), o resultado de f(100) (10000) e novamente o resultado de f(100) (10000), pois value3 também referencia a função f. A chave está em distinguir quando uma função é referenciada (sem parênteses) e quando é invocada (com parênteses).

Em JavaScript, funções são valores de primeira classe: podem ser atribuídas a variáveis, passadas como argumentos e retornadas de outras funções. Quando você escreve let value1 = f;, você está guardando a referência à função, não o resultado da execução. Para executar, é preciso usar os parênteses: f(100). Essa distinção é a base da questão.

Vamos analisar o script passo a passo. Suponha o código:

function f(f) {
  return (f * f);
}

let value1 = f;
let value2 = f(100);
let value3 = value1(100);

alert(value1);
alert(value2);
alert(value3);
  • value1 = fvalue1 agora é a própria função f. Quando alert(value1) é chamado, o JavaScript converte a função para string, exibindo exatamente o texto da definição: function f(f) { return (f*f); }.

  • value2 = f(100) → aqui a função é invocada com o argumento 100. Dentro da função, o parâmetro f recebe 100, e o retorno é 100 * 100 = 10000. O alert(value2) exibe 10000.

  • value3 = value1(100) → como value1 é a mesma função f, invocá-la com 100 produz o mesmo resultado: 10000. O alert(value3) exibe 10000.

Portanto, a saída é: function f(f) { return (f*f); }, 10000, 10000.

A pegadinha clássica é confundir a referência com a invocação. Muitos candidatos marcam a alternativa B, achando que value1 retorna undefined porque a função não foi chamada. Mas, ao atribuir f a value1, você não está executando a função; está apenas criando uma nova referência para ela. O alert de uma função exibe o código-fonte da função (a string da definição), não undefined.

Outro ponto de confusão é o hoisting de declarações de função. Em JavaScript, declarações de função são içadas (hoisted) para o topo do escopo, então você pode chamar f antes mesmo da linha function f(f) {...}. Mas isso não afeta a questão, pois a função é declarada antes de qualquer uso.

Agora, vamos analisar cada alternativa:

  1. 1value1 = f (referência)
  2. 2alert(value1) → definição
  3. 3value2 = f(100) → 10000
  4. 4value3 = value1(100) → 10000
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

Exibe exatamente o que o script produz: a definição da função (porque value1 é a referência), depois 10000 (resultado de f(100)) e novamente 10000 (resultado de value1(100), que é a mesma função). A ordem e os valores batem perfeitamente com a execução.

Alternativa B — ❌ Incorreta

Erra ao colocar undefined como segundo valor. value2 é o resultado da invocação f(100), que retorna 10000, não undefined. O undefined só apareceria se a função não tivesse return ou se você tentasse acessar uma propriedade inexistente.

Alternativa C — ❌ Incorreta

Erra ao colocar undefined como primeiro valor. value1 é a referência à função, e alert(value1) exibe a string da função, não undefined. O undefined seria exibido se value1 fosse uma variável declarada sem valor, mas aqui ela recebe a função f.

Alternativa D — ❌ Incorreta

Apresenta apenas um valor (10000), mas o script executa três alerts. A alternativa ignora as duas primeiras saídas (a definição da função e o primeiro 10000).

Alternativa E — ❌ Incorreta

Erra ao colocar undefined em todas as posições. Nenhuma das três saídas é undefined: a primeira é a string da função, a segunda e a terceira são 10000.

Conclusão: A execução do script exibe, na ordem: a definição da função, 10000 e 10000. Portanto, a alternativa correta é a letra A.

PEGA ESSA DICA!

Na hora da prova, sublinhe mentalmente: sem parênteses = referência; com parênteses = invocação. Se a alternativa mostrar undefined onde deveria haver a função, desconfie imediatamente — a banca está testando exatamente essa confusão. Pratique com pequenos trechos: let x = function(){}; alert(x); exibe a função, não undefined.

Link permanente: /questoes/fg061583