Funções são blocos de código que podem ser definidos e executados sob demanda. Elas são fundamentais para organizar, reutilizar e abstrair lógica em JavaScript. Nesta aula, você compreenderá as duas principais formas de criar funções — declaração e expressão —, como passar dados através de parâmetros e retornar resultados, e por que o reuso é uma prática essencial.

Dominar funções é o primeiro passo para escrever código modular e eficiente. Vamos explorar cada conceito com exemplos claros e progressivos.

Declaração vs expressão

Em JavaScript, uma função pode ser criada de duas maneiras principais: declaração de função (function declaration) e expressão de função (function expression). Embora ambas produzam funções, há diferenças importantes, especialmente em relação ao hoisting.

Declaração de função: usa a palavra-chave function seguida do nome da função. Ela é içada (hoisted), ou seja, pode ser chamada antes de sua definição no código.

// Declaração de função
function saudacao(nome) {
  return "Olá, " + nome + "!";
}

console.log(saudacao("Maria")); // "Olá, Maria!"

Expressão de função: a função é atribuída a uma variável. Nesse caso, a função não é içada — você só pode chamá-la após a atribuição.

// Expressão de função
const saudacao = function(nome) {
  return "Olá, " + nome + "!";
};

console.log(saudacao("João")); // "Olá, João!"

A escolha entre uma e outra depende do contexto: declarações são mais legíveis e flexíveis quanto à ordem, enquanto expressões são úteis para funções anônimas, callbacks ou quando você precisa atribuir funções condicionalmente.

Parâmetros e retorno

Funções podem receber dados de entrada chamados parâmetros e podem devolver um valor usando a palavra-chave return. Se nenhum return for especificado, a função retorna undefined.

function somar(a, b) {
  return a + b;
}

const resultado = somar(5, 3);
console.log(resultado); // 8

Parâmetros são variáveis locais dentro da função. Você pode definir quantos parâmetros desejar. Caso um argumento não seja passado, o parâmetro assume o valor undefined. É possível definir valores padrão (ES6):

function multiplicar(a, b = 1) {
  return a * b;
}

console.log(multiplicar(5));    // 5 (b assume 1)
console.log(multiplicar(5, 2)); // 10

O return encerra a execução da função imediatamente. Qualquer código após o return é ignorado. Você também pode retornar objetos, arrays ou até outras funções.

Reuso

Uma das maiores vantagens das funções é a capacidade de reutilizar código sem repeti-lo. Em vez de escrever a mesma lógica várias vezes, você define a função uma vez e a chama sempre que necessário.

// Sem reuso
let preco1 = 100;
let desconto1 = preco1 * 0.1;
let total1 = preco1 - desconto1;

let preco2 = 200;
let desconto2 = preco2 * 0.1;
let total2 = preco2 - desconto2;

// Com reuso
function calcularTotal(preco, taxaDesconto = 0.1) {
  const desconto = preco * taxaDesconto;
  return preco - desconto;
}

console.log(calcularTotal(100)); // 90
console.log(calcularTotal(200)); // 180

O reuso também facilita a manutenção: se a lógica de desconto mudar, você altera apenas a função, e todos os locais que a chamam são atualizados automaticamente. Além disso, funções bem nomeadas tornam o código mais legível e autoexplicativo.

Boas práticas

  • Use nomes descritivos para funções (verbos que indicam ação, como calcularTotal, obterUsuario).
  • Mantenha funções pequenas e com uma única responsabilidade.
  • Evite modificar variáveis globais dentro de funções; prefira retornar valores.
  • Documente parâmetros e retorno quando a função não for óbvia.

Referências

Exercícios

  1. Crie uma função chamada ehPar que recebe um número e retorna true se for par, false caso contrário. Teste com os valores 4 e 7.
  2. ✓ Resposta:
    function ehPar(numero) {
      return numero % 2 === 0;
    }
    
    console.log(ehPar(4)); // true
    console.log(ehPar(7)); // false
  3. Escreva uma função maior que receba dois números e retorne o maior deles. Se forem iguais, retorne qualquer um.
  4. ✓ Resposta:
    function maior(a, b) {
      return a > b ? a : b;
    }
    
    console.log(maior(10, 20)); // 20
    console.log(maior(5, 5));   // 5
  5. Crie uma expressão de função atribuída a uma variável dobrar que recebe um número e retorna o dobro. Teste com 9.
  6. ✓ Resposta:
    const dobrar = function(numero) {
      return numero * 2;
    };
    
    console.log(dobrar(9)); // 18
  7. Escreva uma função saudacaoPersonalizada que recebe um nome e um período ("manhã", "tarde" ou "noite") e retorne uma saudação como "Bom dia, João!". Use parâmetros com valor padrão para o período ser "dia" caso não informado.
  8. ✓ Resposta:
    function saudacaoPersonalizada(nome, periodo = "dia") {
      let saudacao;
      if (periodo === "manhã") {
        saudacao = "Bom dia";
      } else if (periodo === "tarde") {
        saudacao = "Boa tarde";
      } else if (periodo === "noite") {
        saudacao = "Boa noite";
      } else {
        saudacao = "Olá";
      }
      return saudacao + ", " + nome + "!";
    }
    
    console.log(saudacaoPersonalizada("João", "manhã")); // "Bom dia, João!"
    console.log(saudacaoPersonalizada("Maria"));         // "Olá, Maria!"
  9. Crie uma função contagemRegressiva que recebe um número n e exibe no console os números de n até 0 (incluindo 0), um por linha. A função não precisa retornar nada.
  10. ✓ Resposta:
    function contagemRegressiva(n) {
      for (let i = n; i >= 0; i--) {
        console.log(i);
      }
    }
    
    contagemRegressiva(5);
    // Saída:
    // 5
    // 4
    // 3
    // 2
    // 1
    // 0