Get to know MDN better
Esta página foi traduzida do inglês pela comunidade. Saiba mais e junte-se à comunidade MDN Web Docs.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since setembro de 2016.
Uma expressão arrow function possui uma sintaxe mais curta quando comparada a uma expressão de função (function expression) e não tem seu próprio this, arguments, super ou new.target. Estas expressões de funções são melhor aplicadas para funções que não sejam métodos, e elas não podem ser usadas como construtores (constructors).
Veja também "ES6 In Depth: Arrow functions" on hacks.mozilla.org.
Dois fatores influenciaram a introdução das arrow functions: funções mais curtas e a inexistência da palavra chave this.
Antes das arrow functions, toda nova função definia seu próprio valor de this (baseado em como a função era chamada, um novo objeto no caso de um construtor, undefined em chamadas de funções com modo estrito (strict mode), o objeto base se a função é chamada como um "método de objeto", etc.). Este comportamento é importuno com um estilo de programação orientado a objeto.
No ECMAScript 3/5, este comportamento era corrigido definindo o valor em this à uma variável que pudesse ser encapsulada.
Alternativamente, uma função de ligação (bound function) pode ser criada para que o valor pré-atribuido à this seja passado para a função alvo de ligação (a função growUp() no exemplo acima.
Uma arrow function não tem seu próprio this; o valor this do contexto léxico encapsulado é usado. Ex: Arrow functions seguem as regras normais de pesquisa de variáveis. Então, ao procurar por this, que não está no escopo atual elas acabam encontrando this no escopo encapsulado. Assim, no código a seguir, o this dentro da função que é passado para setInterval tem o mesmo valor do this na função lexicamente encapsulada:
Considerando que this vem do contexto léxico envolvente, as regras do modo estrito (strict mode) em relação ao this são ignoradas.
O restante das regras do modo estrito (strict mode) são aplicadas normalmente.
Já que as arrow functions não têm o próprio this, os métodos call() ou apply() só podem passar parâmetros. thisArg é ignorado.
var adder = { base: 1, add: function(a) { var f = v => v + this.base; return f(a); }, addThruCall: function(a) { var f = v => v + this.base; var b = { base: 2 }; return f.call(b, a); } }; console.log(adder.add(1)); // Deve logar 2 console.log(adder.addThruCall(1)); // Deve logar 2 aindaArrow functions não tem o próprio objeto argumentos (arguments object). Assim, neste exemplo, arguments é simplesmente uma referência aos argumentos do escopo encapsulado:
var arguments = [1, 2, 3]; var arr = () => arguments[0]; arr(); // 1 function foo(n) { var f = () => arguments[0] + n; // ligação implícita dos argumentos de foo. arguments[0] é n return f(); } foo(3); // 6Na maioria dos casos, usar parâmetros rest (rest parameters) é uma boa alternativa a usar um objeto arguments.
Como afirmado anteriormente, expressões arrow function são melhores para funções que não sejam métods. Vamos ver o que acontece quando tentamos usá-las como métodos.
'use strict'; var obj = { i: 10, b: () => console.log(this.i, this), c: function() { console.log(this.i, this); } } obj.b(); // imprime undefined, Window {...} (ou o objeto global) obj.c(); // imprime 10, Object {...}Arrow functions não tem o próprio this. Outro exemplo envolvendo Object.defineProperty():
'use strict'; var obj = { a: 10 }; Object.defineProperty(obj, 'b', { get: () => { console.log(this.a, typeof this.a, this); // undefined 'undefined' Window {...} (ou o objeto global) return this.a + 10; // representa o objeto global 'Window', portanto 'this.a' retorna 'undefined' } });Arrow functions não podem ser usadas como construtores e lançarão um erro quando usadas com o new.
Arrow functions não têm a propriedade prototype.
var Foo = () => {}; console.log(Foo.prototype); // undefinedA palavra chave yield não pode ser usada no corpo de uma arrow function (exceto quando permitido dentro de funções aninhadas dentro delas). como consequência, arrow functions não podem ser usadas como geradoras (generators).
Arrow functions podem ter um corpo conciso ("concise body") ou o usual corpo em bloco ("block body").
Em um concise body, apenas uma expressão é especificada, a qual se torna o valor de retorno implícito. Em um block body, você precisa explicitamente usar a declaração de retorno, ou seja, o return.
var func = x => x * x; // sintaxe de concise body. O "return" é implícito var func = (x, y) => { return x + y; }; // Em um função com block body, é necessário um "return" explícitoTenha em mente que retornar objetos literais usando a sintaxe de corpo conciso (concise body) params => {object:literal} não funcionará como esperado.
var func = () => { foo: 1 }; // Chamar func() retornará undefined! var func = () => { foo: function() {} }; // SyntaxError (Erro de sintaxe): a declaração da função requer um nomeIsto acontece porque o código dentro das chaves ({}) é convertido como uma sequência de sentenças (ex: foo é tratado como um título, não como uma chave num objeto literal).
Se lembre de envolver o objeto literal em parênteses.
var func = () => ({foo: 1});Uma arrow function não pode conter uma quebra de linha entre seus parâmetros e sua flecha.
var func = (a, b, c) => 1; // SyntaxError (Erro de sintaxe): esperada expressão, mas obteve '=>'Entretanto, isto pode ser corrigido ao usar parênteses ou colocar a quebra de linha dentro dos argumentos como visto abaixo para garantir que o código permaneça bonito e leve.
Apesar de a flecha numa arrow function não ser um operador, arrow functions possuem regras especiais de análise que interagem diferentemente com precedência de operador (operator precedence) comparadas à funções comuns.
let callback; callback = callback || function() {}; // ok callback = callback || () => {}; // SyntaxError (Erro de sintaxe): argumentos inválidos de arrow-function callback = callback || (() => {}); // ok| ECMAScript® 2027 Language Specification # sec-arrow-function-definitions |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 17 de fev. de 2025 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.