\n\nTomando como referência apenas esse trecho, um clique no botão com a página carregada provoca a exibição de:","inLanguage":"pt-BR","eduQuestionType":"Multiple choice","acceptedAnswer":{"@type":"Answer","text":"A) três alertas, com as mensagens “OK”, “OK” e “ERRO”;. Essa questão explora um detalhe clássico do JavaScript: a função pode receber qualquer quantidade de argumentos, mesmo que a assinatura não liste parâmetros. Dentro da função, o objeto especial arguments guarda o que foi efetivamente passado. Aqui, xpto(1,2,3) tem 3 argumentos, xpto(0) tem 1 e xpto() tem 0.\n\nO teste feito é simples: se arguments.length for 0, a variável text recebe \"ERRO\"; caso contrário, recebe \"OK\". Depois disso, a função mostra o valor com alert(text). Como cada chamada é executada separadamente a partir do atributo onclick, cada uma gera seu próprio alerta.\n\nAssim, a primeira chamada mostra \"OK\", a segunda também mostra \"OK\" e a terceira mostra \"ERRO\". Em prova, a banca costuma cobrar essa diferença entre parâmetro formal e argumentos recebidos de verdade, que é um clássico do JavaScript raiz.\n\nResumo prático: em JavaScript, o que manda não é o nome da função, mas o que chegou dentro de arguments. Se chegou algo, a lógica cai no bloco \"OK\"; se não chegou nada, cai no \"ERRO\"."},"suggestedAnswer":[{"@type":"Answer","text":"B) três alertas, com as mensagens “undefined”, “undefined” e\n“ERRO”;"},{"@type":"Answer","text":"C) um alerta apenas, com a mensagem “ERRO”;"},{"@type":"Answer","text":"D) um alerta apenas, com a mensagem “OK”;"},{"@type":"Answer","text":"E) um alerta apenas, com a mensagem “undefined”."}]}← Questões de Programação
Programação · FGV · 2022
Questão comentada de Programação
Analise o trecho de página Web a seguir.
<body>
<button
onclick="xpto(1,2,3);xpto(0);xpto();">?</button>
<script>
function xpto() {
if (arguments.length == 0) {
text = "ERRO";
}
else {
text = "OK";
}
alert(text);
}
</script>
</body>
Tomando como referência apenas esse trecho, um clique no botão com a página carregada provoca a exibição de:
A)três alertas, com as mensagens “OK”, “OK” e “ERRO”;
Correta, porque as três chamadas de xpto geram três alertas: "OK" para 3 argumentos, "OK" para 1 argumento e "ERRO" para 0 argumentos.
B)três alertas, com as mensagens “undefined”, “undefined” e
“ERRO”;
Errada, porque o código não imprime "undefined"; ele atribui explicitamente "OK" ou "ERRO" à variável text antes do alert.
C)um alerta apenas, com a mensagem “ERRO”;
Errada, porque o onclick executa três chamadas separadas e cada uma dispara um alert próprio.
D)um alerta apenas, com a mensagem “OK”;
Errada, porque a primeira chamada recebe argumentos e a última chamada, sem argumentos, faz o alerta virar "ERRO".
E)um alerta apenas, com a mensagem “undefined”.
Errada, porque "undefined" seria possível se a variável não fosse definida, mas aqui text sempre recebe um valor antes do alert.
Gabarito: A
Essa questão explora um detalhe clássico do JavaScript: a função pode receber qualquer quantidade de argumentos, mesmo que a assinatura não liste parâmetros. Dentro da função, o objeto especial arguments guarda o que foi efetivamente passado. Aqui, xpto(1,2,3) tem 3 argumentos, xpto(0) tem 1 e xpto() tem 0.
O teste feito é simples: se arguments.length for 0, a variável text recebe "ERRO"; caso contrário, recebe "OK". Depois disso, a função mostra o valor com alert(text). Como cada chamada é executada separadamente a partir do atributo onclick, cada uma gera seu próprio alerta.
Assim, a primeira chamada mostra "OK", a segunda também mostra "OK" e a terceira mostra "ERRO". Em prova, a banca costuma cobrar essa diferença entre parâmetro formal e argumentos recebidos de verdade, que é um clássico do JavaScript raiz.
Resumo prático: em JavaScript, o que manda não é o nome da função, mas o que chegou dentro de arguments. Se chegou algo, a lógica cai no bloco "OK"; se não chegou nada, cai no "ERRO".