Respostas
Desafios de Funções em JavaScript: Pratique e Domine!
Nível Básico (Questões 1-8)
Uma função é um bloco de código reutilizável projetado para executar uma tarefa específica. Os três principais benefícios são:
Organizar o código: Separam tarefas complexas em partes menores e mais gerenciáveis.
Evitar repetição: Você escreve a lógica uma vez e a chama quantas vezes precisar.
Facilitar a manutenção: Corrigir um bug em uma função corrige o problema em todos os lugares onde ela é usada.
Palavra-chave:
function
(inicia a declaração da função).Nome da função:
calcularMedia
(o nome que usamos para chamar a função).Parâmetros:
nota1
enota2
(as "variáveis" que a função espera receber).Valor de retorno:
(nota1 + nota2) / 2
(o cálculo que a instruçãoreturn
envia de volta).
Parâmetros: São as variáveis listadas na definição da função (ex:
nota1
,nota2
). Eles agem como espaços reservados para os valores que a função receberá.Argumentos: São os valores reais passados para a função quando ela é chamada (ex:
calcularMedia(8, 9)
, onde8
e9
são os argumentos).
const despedida = function() {
// Esta função não tem nome, por isso é anônima.
// Ela foi atribuída à variável 'despedida'.
console.log("Até logo!");
};
despedida(); // Chama a função através da variável.
A principal vantagem é a sintaxe mais curta e compacta. Elas permitem escrever funções de forma mais limpa e rápida, especialmente para operações de uma única linha.
// Para um único parâmetro, os parênteses são opcionais.
// Como há apenas uma instrução, as chaves {} e a palavra 'return' podem ser omitidas.
const quadrado = n => n * n;
console.log(quadrado(4)); // Vai mostrar: 16
Não, uma função não precisa ter
return
.
Com
return
: A função executa seu código e devolve um valor para quem a chamou. Esse valor pode ser armazenado em uma variável.Sem
return
: A função apenas executa uma ação (como imprimir algo no console), mas não devolve um valor. O resultado da chamada de uma função semreturn
é sempreundefined
.
function boasVindas(nome) {
// Usar template string (crase) é uma forma moderna e legível de montar strings.
console.log(`Bem-vindo(a), ${nome}! 😊`);
}
boasVindas("Marina"); // Vai mostrar: Bem-vindo(a), Marina! 😊
Nível Intermediário (Questões 9-18)
A "pilha de chamadas" é um mecanismo que o JavaScript usa para controlar a execução das funções. Cada vez que uma função é chamada, ela é "empilhada" (adicionada ao topo da pilha). Quando a função termina (encontra um
return
ou o final do seu bloco), ela é "desempilhada" (removida do topo). Isso garante que o fluxo do programa sempre retorne ao ponto correto após a conclusão de uma função.A declaração tradicional (
function nome() {}
) sofre hoisting. Isso significa que a declaração da função é "movida" para o topo do seu escopo pelo JavaScript antes da execução do código. Na prática, isso permite que você chame a função antes mesmo de declará-la no código, o que não acontece com expressões de função ou arrow functions.O resultado será:
cachorro
gato
O primeiro
console.log
está dentro da funçãomostrarAnimal
, que tem sua própria variávelanimal
("cachorro") em seu escopo local. Ela usa essa variável.O segundo
console.log
está fora da função, no escopo global. Ele acessa a variávelanimal
global, cujo valor é "gato".
O nome mais adequado é
verificarLogin
. Ele segue as convenções de usar um verbo (verificar
) para indicar uma ação ecamelCase
para juntar palavras de forma legível. Nomes comocheck
são genéricos efuncao_de_login
usa um padrão diferente (snake_case).A função retornará
undefined
. O erro comum é esquecer a palavra-chavereturn
. Embora o cálculoa - b
seja feito e armazenado emresultado
, a função não devolve esse valor para quem a chamou.Uma IIFE (Immediately Invoked Function Expression) é uma função que é declarada e executada no mesmo instante. Sua principal utilidade é criar um escopo isolado para evitar que variáveis "vazem" para o escopo global e causem conflitos com outras partes do código.
soma(5, 10, 15)
: O argumento extra (15
) é simplesmente ignorado. A função usará apenas os dois primeiros (5
e10
), e o resultado será15
.soma(5)
: O segundo parâmetro (b
) não recebe um argumento, então seu valor se tornaundefined
. A operação5 + undefined
resulta emNaN
(Not a Number).
// Adicionamos um valor padrão ao parâmetro nome.
// Se nenhum argumento for passado, "visitante" será usado.
function saudacao(nome = "visitante") {
console.log(`Olá, ${nome}!`);
}
saudacao("Lucas"); // Olá, Lucas!
saudacao(); // Olá, visitante!
É uma função que faz pelo menos uma das seguintes coisas:
Recebe uma ou mais funções como argumento (callback).
Retorna uma função como seu resultado. Exemplo: O método
.map()
de arrays é uma função de ordem superior, pois recebe uma função como argumento para aplicar a cada item.
O valor de
resultado
seráundefined
. A funçãoconsole.log
exibe um valor no terminal, mas seu próprio valor de retorno éundefined
. Como a funçãomostrarAlerta
retorna o resultado deconsole.log
, ela acaba retornandoundefined
.
Nível Avançado (Questões 19-30)
Closure é a capacidade de uma função "lembrar" e acessar as variáveis do escopo onde ela foi criada, mesmo que esse escopo já tenha sido encerrado. No exemplo
criarContador
, a função interna retornada ainda tem acesso à variávelcontador
da função externacriarContador
, mesmo apóscriarContador
já ter sido executada.A função retornará
100
. O parâmetro "rest" (...numeros
) coleta todos os argumentos passados (10, 20, 30, 40
) e os transforma em um array[10, 20, 30, 40]
. O métodoreduce
então soma todos os elementos desse array.
setTimeout(callback, tempo)
: Executa a função decallback
uma única vez após otempo
especificado.setInterval(callback, tempo)
: Executa a função decallback
repetidamente, a cadatempo
especificado, até que seja interrompido (comclearInterval
).
Um "callback" é uma função que é passada como argumento para outra função, com a intenção de ser executada mais tarde.
function processar(numero, callback) {
let resultado = numero * 2;
callback(resultado); // "Chamando de volta" a função recebida
}
// Usando console.log como callback:
processar(10, console.log); // Vai mostrar: 20
Uma função recursiva é uma função que chama a si mesma dentro de seu próprio corpo. O elemento essencial é a condição de parada (ou caso base). É uma verificação que impede a função de se chamar infinitamente, evitando que a pilha de chamadas estoure (
stack overflow
).É desaconselhado por motivos de segurança e performance. Ele avalia o código a partir de uma string, o que é semelhante a usar
eval()
. Isso pode abrir brechas de segurança (injeção de código) e é mais lento para o motor do JavaScript otimizar do que funções declaradas normalmente.O objeto
arguments
é um objeto "parecido com um array" (array-like) que contém todos os argumentos passados para uma função (exceto em arrow functions). O parâmetro "rest" (...
) é preferido porque:Ele cria um array de verdade, permitindo o uso direto de métodos como
.map()
,.filter()
, etc.É mais explícito e legível, deixando claro que a função pode receber múltiplos argumentos.
Ocorrerá um erro:
TypeError: soma is not a function
. A declaração da funçãosoma
foi sobrescrita pela linhalet soma = 10;
. No momento em quesoma()
é chamada, a variávelsoma
contém o número10
, e não uma função, portanto não pode ser invocada com()
.
Caso 1: Funciona por causa do hoisting. As declarações de função (
function nome(){}
) são "elevadas" ao topo do escopo, entãomostrarMensagem
já é conhecida quando é chamada.Caso 2: Gera um
ReferenceError
. Funções atribuídas a variáveis comconst
(oulet
) não sofrem hoisting. A tentativa de chamarmostrarMensagem2
ocorre antes de sua inicialização, causando o erro.
function avaliarAluno(nota1, nota2) {
const media = (nota1 + nota2) / 2;
if (media >= 7) {
return "Aprovado";
} else if (media >= 5) {
return "Recuperação";
} else {
return "Reprovado";
}
}
console.log(avaliarAluno(8, 6)); // Média 7 -> Aprovado
function calcularNotas(...notas) {
if (notas.length === 0) return 0; // Evita divisão por zero
const soma = notas.reduce((total, nota) => total + nota, 0);
return soma / notas.length;
}
console.log(calcularNotas(7, 8, 9, 10)); // Deve retornar: 8.5
function repetir(callback, n) {
// O laço vai de 0 até n-1, executando n vezes.
for (let i = 0; i < n; i++) {
callback(); // Executa a função recebida.
}
}
repetir(() => console.log("Praticar leva à perfeição!"), 3);
Last updated