Conceitos Básicos de Arrow Functions em JavaScript
Aprenda arrow functions em JavaScript: sintaxe ES6, retornos implícitos, parâmetros simples e múltiplos, retorno de objetos e herança de this do escopo.
Introdução às Arrow Functions
As arrow functions, introduzidas no ES6 (ECMAScript 2015), são uma forma concisa de escrever expressões de função em JavaScript. Elas são especialmente úteis para funções curtas e são usadas em toda parte em bibliotecas e aplicações modernas de JavaScript — particularmente como callbacks passados para métodos de array, timers e manipuladores de eventos.
Uma arrow function é mais do que apenas uma sintaxe mais curta. Ela também se comporta de forma diferente de uma função regular em um aspecto importante: ela não cria seu próprio this. Esta página aborda a sintaxe e o comportamento de this; para casos extremos avançados (sem arguments, sem new, sem generators), veja Arrow functions, revisitadas.
Sintaxe Básica
A forma geral de uma arrow function é:
let functionName = (param1, param2, ..., paramN) => expression;Isso cria uma função que recebe param1, param2, ..., paramN como parâmetros e retorna o resultado de expression. O token => é lido como "vai para" ou simplesmente "flecha".
A expressão de função tradicional equivalente tem esta aparência — comparar as duas lado a lado mostra o que a sintaxe de flecha omite:
A versão com flecha remove a palavra-chave function, as chaves e o return explícito. O resultado é o mesmo.
Arrow Functions de Uma Linha (Retorno Implícito)
Quando o corpo é uma única expressão, você pode omitir as chaves e a palavra-chave return. O valor da expressão é retornado automaticamente — isso é chamado de retorno implícito:
Arrow Functions de Múltiplas Linhas (Retorno Explícito)
Se o corpo precisar de mais de uma instrução, envolva-o em chaves {}. Ao usar chaves, o retorno implícito desaparece, então você deve escrever return explicitamente se quiser retornar um valor:
Esquecer o return dentro das chaves é um erro comum para iniciantes: a função então retorna undefined.
Regras dos Parênteses
Os parênteses em torno dos parâmetros seguem regras simples:
- Um parâmetro: parênteses são opcionais —
x => x * 2. - Nenhum parâmetro: parênteses vazios são obrigatórios —
() => 42. - Dois ou mais parâmetros: parênteses são obrigatórios —
(a, b) => a + b.
Retornando um Objeto Literal
Para retornar um object com a sintaxe de retorno implícito, envolva o object em parênteses. Sem eles, o JavaScript lê o { como o início de um corpo de função, não de um object literal — então o corpo da função apenas executa e retorna undefined:
Vantagens das Arrow Functions
- Concisão — Arrow functions têm uma sintaxe mais curta comparada às expressões de função tradicionais, o que mantém os callbacks legíveis.
thisléxico — Arrow functions não têm seu própriothis. Elas obtêmthisdo escopo circundante (pai), o que elimina toda uma classe de bugs relacionados à perda dethisem callbacks.- Retornos implícitos — Com a sintaxe de uma linha, o
returné automático, tornando transformações curtas mais limpas.
Como this Funciona nas Arrow Functions
Esta é a diferença mais importante entre arrow functions e funções regulares. Uma função regular obtém seu próprio this, determinado por como ela é chamada. Uma arrow function não tem this próprio — ela busca this no escopo onde foi definida. Isso é conhecido como this léxico.
O problema clássico aparece dentro de um método que agenda um callback. Com uma função regular, o this do callback é perdido; com uma arrow function, this é herdado:
Como a arrow function captura this de startArrow (onde this é o object counter), ela lê corretamente this.value. A função regular dentro de setTimeout é chamada sem contexto de object, então seu this.value é undefined. Para uma análise mais aprofundada de como this é determinado em métodos regulares, veja Métodos de objeto, "this".
Limitações das Arrow Functions
As arrow functions não são um substituto universal para toda função. O this léxico é exatamente o que as torna inadequadas em alguns contextos.
- Não são ideais como métodos de object — Como uma arrow function herda
thisdo escopo circundante em vez do object em que é chamada, usá-la como método geralmente não produz o resultado esperado. - Não podem ser construtoras — Arrow functions não podem ser usadas com
newe lançam um erro se você tentar; elas não são construtoras. - Sem object
argumentspróprio — Dentro de uma arrow function,argumentsrefere-se ao escopo externo, não aos argumentos passados para a arrow function em si. Use parâmetros rest (...args) em vez disso.
O problema com métodos na prática — this não aponta para o object:
Quando Usar Cada Uma
- Prefira uma arrow function para callbacks curtos: métodos de array, promises, timers e manipuladores de eventos onde você quer manter o
thiscircundante. - Prefira uma função regular quando precisar de um método que usa
thispara referenciar seu próprio object, uma construtora ou acesso ao objectarguments.
Exemplos Práticos
Métodos de Array
Arrow functions se destacam com métodos de array como map, filter e reduce, onde cada chamada é uma pequena transformação:
Ouvintes de Eventos
Arrow functions são convenientes para ouvintes de eventos, especialmente dentro de uma classe ou object onde você quer que this continue apontando para a instância circundante (este exemplo usa o navegador, portanto execute-o em uma página em vez do console):
document.getElementById("myButton").addEventListener("click", () => {
console.log("Button clicked!");
});Callbacks e Promises
Elas mantêm o código assíncrono compacto quando usadas como callbacks:
Conclusão
Arrow functions são um recurso versátil e cotidiano do JavaScript moderno. Elas fornecem uma sintaxe concisa, suportam retornos implícitos para corpos de uma linha e — mais importante — herdam this do escopo circundante, o que evita bugs comuns de contexto em callbacks. São ideais para métodos de array, promises e manipuladores de eventos, mas não para métodos de object que dependem do próprio this, construtoras ou código que precisa do object arguments. Saber quando cada tipo de função é adequado é a chave para usá-las bem. Continue com Arrow functions, revisitadas para os casos extremos restantes.