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:
nota1enota2(as "variáveis" que a função espera receber).Valor de retorno:
(nota1 + nota2) / 2(o cálculo que a instruçãoreturnenvia 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), onde8e9sã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.
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.
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
returnou 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á:
O primeiro
console.logestá dentro da funçãomostrarAnimal, que tem sua própria variávelanimal("cachorro") em seu escopo local. Ela usa essa variável.O segundo
console.logestá fora da função, no escopo global. Ele acessa a variávelanimalglobal, cujo valor é "gato".
O nome mais adequado é
verificarLogin. Ele segue as convenções de usar um verbo (verificar) para indicar uma ação ecamelCasepara juntar palavras de forma legível. Nomes comochecksão genéricos efuncao_de_loginusa um padrão diferente (snake_case).A função retornará
undefined. O erro comum é esquecer a palavra-chavereturn. Embora o cálculoa - bseja 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 (5e10), 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 + undefinedresulta emNaN(Not a Number).
É 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
resultadoseráundefined. A funçãoconsole.logexibe um valor no terminal, mas seu próprio valor de retorno éundefined. Como a funçãomostrarAlertaretorna 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ávelcontadorda função externacriarContador, mesmo apóscriarContadorjá 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étodoreduceentão soma todos os elementos desse array.
setTimeout(callback, tempo): Executa a função decallbackuma única vez após otempoespecificado.setInterval(callback, tempo): Executa a função decallbackrepetidamente, a cadatempoespecificado, 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.
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çãosomafoi sobrescrita pela linhalet soma = 10;. No momento em quesoma()é chamada, a variávelsomaconté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ãomostrarMensagemjá é conhecida quando é chamada.Caso 2: Gera um
ReferenceError. Funções atribuídas a variáveis comconst(oulet) não sofrem hoisting. A tentativa de chamarmostrarMensagem2ocorre antes de sua inicialização, causando o erro.
Atualizado

