JavaScript: Funções em JavaScript

Última atualização: 2026-10-13

Funções são blocos de código reutilizáveis — escreva uma vez, use infinitamente. Pense nelas como receitas: defina os passos uma vez, depois siga-os toda vez que cozinhar. Um programador que não usa funções é como alguém reinventando cada prato do zero — exaustivo e propenso a erros.

Declarações relacionadas:setTimeout forEach filter return const let var map

1. O Que É uma Função?

Uma função "encapsula" um pedaço de lógica, dá um nome a ela e permite que você a chame quando precisar:

HTML
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Chamando Funções</title></head>
<body>
<div id="output"></div>
<script>
function sayHello() {
  document.getElementById('output').textContent += 'Olá!\n';
}

sayHello();
sayHello();
</script>
</body>
</html>

Benefícios das funções:


Existem duas maneiras principais de criar funções:

HTML
<script>
// Declaração de função
function greet(name) {
  return `Olá, ${name}!`;
}

// Expressão de função
let greet2 = function(name) {
  return `Olá, ${name}!`;
};
</script>

Diferença-chave: declarações de função são elevadas (hoisted) — você pode chamá-las antes de aparecerem no código. Expressões de função não são elevadas; você deve defini-las primeiro.

HTML
<script>
// Declaração de função: chamar antes da definição — funciona
hello();  // Executa sem erro
function hello() { console.log('oi'); }

// Expressão de função: chamar antes da definição — erro
// hi();     // TypeError: hi is not a function
// let hi = function() { console.log('oi'); };
</script>
⚠️ Nota: Acessar uma variável let antes de sua declaração dispara um erro de "zona morta temporal" (TDZ) — não undefined. Então sempre defina expressões de função antes de usá-las.


3. Parâmetros e Parâmetros Padrão

Funções aceitam dados externos através de parâmetros:

HTML
<script>
function add(a, b) {
  return a + b;
}
add(1, 2);  // 3
</script>

Parâmetros que você não passa são undefined. O ES6 introduziu parâmetros padrão:

HTML
<script>
function greet(name, greeting = 'Olá') {
  return `${greeting}, ${name}!`;
}

greet('Alice');           // 'Olá, Alice!'
greet('Alice', 'Oi');    // 'Oi, Alice!'
</script>
💡 Dica: Coloque parâmetros padrão no final da lista. Colocá-los primeiro é inútil — os chamadores não podem pulá-los para passar os posteriores.


4. Valores de Retorno

return envia um resultado de volta ao chamador e imediatamente para a função:

HTML
<script>
function square(n) {
  return n * n;
}

let result = square(5);  // 25
</script>

Uma função sem return (ou com apenas return;) retorna undefined.

HTML
<script>
function doNothing() {
  // sem return
}
doNothing();  // undefined
</script>
⚠️ Nota: Uma nova linha após return causa inserção automática de ponto e vírgula, fazendo-o retornar undefined:

return     // vira: return; undefined
  obj;     // esta linha nunca executa

Solução: mantenha o valor de retorno na mesma linha, ou envolva-o em parênteses.


5. Arrow Functions (=>)

Arrow functions são uma sintaxe mais curta introduzida no ES6:

HTML
<script>
// Função regular
let double = function(n) {
  return n * 2;
};

// Arrow function
let double2 = (n) => n * 2;

// Múltiplas instruções requerem chaves e return explícito
let greet = (name) => {
  let msg = `Olá, ${name}!`;
  return msg;
};
</script>

Regras de sintaxe:

▶ Exemplo: Uso Básico de Funções

▶ Experimente

▶ Exemplo: Calculadora Simples

▶ Experimente

6. Escopo de Função

Variáveis declaradas dentro de uma função são locais — elas só existem dentro daquela função. Isso é escopo:

HTML
<script>
function test() {
  let x = 10;    // variável local
  const y = 20;
  var z = 30;
}
test();
// console.log(x);  // ReferenceError: x is not defined
</script>

Funções podem acessar variáveis externas (a base dos closures), mas o código externo não pode acessar variáveis dentro de uma função:

HTML
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Escopo de Função</title></head>
<body>
<pre id="output"></pre>
<script>
let global = 'Variável global';

function show() {
  let local = 'Variável local';
  document.getElementById('output').textContent +=
    'Dentro da função — global: ' + global + '\n' +
    'Dentro da função — local: ' + local + '\n';
}
show();
document.getElementById('output').textContent +=
  'Fora da função — global: ' + global + '\n' +
  'Fora da função — local: não acessível (variável local)';
</script>
</body>
</html>
⚠️ Nota: Atribuir uma variável dentro de uma função sem let/const/var cria uma variável global — uma fonte comum de bugs. Sempre declare variáveis com let ou const.

▶ Exemplo: Demonstração de Escopo

▶ Experimente

7. Introdução a Callbacks

JavaScript permite que você passe uma função como argumento para outra função — a função passada é chamada de callback:

HTML
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Callbacks</title></head>
<body>
<pre id="output"></pre>
<script>
function processArray(arr, callback) {
  for (let item of arr) {
    callback(item);
  }
}

let names = ['Alice', 'Bob', 'Charlie'];
processArray(names, function(name) {
  document.getElementById('output').textContent += 'Olá, ' + name + '\n';
});
</script>
</body>
</html>

Você já usou callbacks — os argumentos de forEach, map e filter são todos funções de callback:

HTML
<script>
// A função anônima aqui é um callback
[1, 2, 3].forEach(function(n) {
  console.log(n);
});

// Arrow functions tornam mais conciso
[1, 2, 3].forEach(n => console.log(n));
</script>
💡 Dica: Callbacks são a alma do JavaScript. Manipuladores de eventos, temporizadores e requisições de rede dependem do mecanismo de callback. Por enquanto, lembre-se: "uma função pode ser passada como argumento." Vamos mais a fundo depois.

▶ Exemplo: Callbacks em Ação

▶ Experimente

Declarações relacionadas:setTimeout forEach filter return const let var map

❓ Perguntas Frequentes

P Qual a diferença entre arrow functions e funções regulares?
R Além da sintaxe mais curta, arrow functions não têm seu próprio this — elas herdam do escopo circundante. Quando você precisa que this se refira ao objeto atual (em métodos ou manipuladores de eventos), use uma função regular. Para funções utilitárias simples, a sintaxe arrow funciona muito bem.
P Uma função pode retornar múltiplos valores?
R Não diretamente, mas você pode retornar um array ou objeto e desestruturá-lo: function getInfo() { return [nome, idade]; } — depois chame com let [nome, idade] = getInfo().
P E se eu tiver parâmetros demais?
R Quando você tem mais de 3 parâmetros, considere usar um objeto: function createUser({ nome, idade, cidade }) {} — chame com createUser({ nome: 'Alice', idade: 20, cidade: 'SP' }). A ordem não importa, e é muito mais legível.

📖 Resumo


📝 Exercícios

  1. Escreva uma função isEven(n) que retorna true se um número é par, false caso contrário. Teste com múltiplos valores na página.
  2. Escreva uma função formatPrice(preco) que recebe um número e retorna uma string de preço formatada (ex: formatPrice(9.9) retorna "R$9,90"). Use sintaxe de arrow function.
  3. Construa um "gerador de saudações": use uma função de callback que recebe um array de nomes e uma função de saudação, depois exiba saudações personalizadas para cada pessoa na página.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%