Entendendo Arrow Functions no Javascript
Sem sombras de dúvidas o Javascript evoluiu muito com o tempo, tornando-se uma linguagem extremamente rica, cheia de nuances e peculiaridades (e muitas controvérsias também). Desde da mais impactante atualização da história da linguagem, ocorrida na especificação ECMAScript 6, o Javascript só ganha mais força.
Uma das adições mais interessante foi as arrow functions, ou funções de seta. Isso porque literalmente usamos caracteres de forma que cria-se um formato de seta. Antes de partir para as arrow functions, vamos primeiro declarar duas funções no modo clássico:
// considere esse monstro:
let monstro = {
nome: 'Orc',
hp: 50
}
// funções:
function ataqueSimples (inimigo) {
inimigo.hp -= 10;
}
function ataqueCarregado (inimigo, tempoCarregado) {
inimigo.hp -= (10 + tempoCarregado)
}
Aqui temos funções que proferem dano a um inimigo, simplesmente decrementando o hp dele em uma quantia. A primeira recebe um parametro e a segunda dois. Vamos agora atacar o monstro:
ataqueSimples(monstro)
ataqueSimples(monstro)
console.log(monstro) // {nome: 'Orc', hp: 30}
// ou usando a de ataque carregado:
ataqueCarregado(monstro, 5)
console.log(monstro) // {nome: 'Orc', hp: 35}
Vamos reescreve-lás em arrow functions agora:
const ataqueSimples = inimigo => inimigo.hp -= 10;
const ataqueCarregado = (inimigo, tempoCarregado) => {
inimigo.hp -= (10 + tempoCarregado)
}
Entendendo as diferenças
Na parte estética, logo de cara, percebemos que muita coisa muda:
- agora atribuimos a função a uma variável (leia mais sobre variáveis em: Um pouco sobre variáveis no Javascript ), criando assim uma expressão e não mais declaramos a função de forma literal;
- além de abrir o bloco da função simplesmente com chaves temos agora a seta
=>
antes delas; - em funções que levam apenas um parametros, podemos omitir os parenteses (perceba na função
ataqueSimples
); - em funções onde o bloco possui apenas uma linha podemos omitir até mesmo as chaves (perceba novamente em
ataqueSimples
);
No que se diz respeito a chamada da função vemos que nada muda, mas vamos agora aos conceitos por debaixo dos panos:
- As arrow functions não possuem seu próprio
this
, arguments e nem podem ser usadas como construtoras; - Quando criamos uma arrow function em uma linha, de forma implícita, o que estiver ali é retornado, como se usassemos a palavra reservada
return
; - Não é possível nomear uma arrow function, por isso elas sempre serão anônimas (damos o nome a variável, que contém a arrow function anônima);
Retorno implícito
Como relatado na sessão anterior, as arrow functions podem retornar algo de forma implícita quando nossa função tem apenas uma linha. Veja:
const pedirUmaMusicaAoBardo = musica => `Ei Bardo, toca ${musica}!`;
console.log(
pedirUmaMusicaAoBardo('Blind Guardian - Bards Song')
)
// Ei Bardo, toca Blind Guardian - Bards Song!
Leia mais sobre concatenação de strings em: Concatenando string no Javascript
A arrow function subentendeu que queriamos que a função retornasse a string. Mas e se tentarmos fazer isso com uma function normal? Vejamos:
function pedirUmaMusicaAoBardo (musica) { `Ei Bardo, toca ${musica}!` }
console.log(
pedirUmaMusicaAoBardo('Blind Guardian - Bards Song')
)
// undefined
Ou seja, escrevemos uma string lá dentro mas a function não entendeu que queriamos retorná-la. Para consertar isso teriamos de retornar explicitamente, fazendo o seguinte:
function pedirUmaMusicaAoBardo (musica) {
return `Ei Bardo, toca ${musica}!`
}
console.log(
pedirUmaMusicaAoBardo('Blind Guardian - Bards Song')
)
// Ei Bardo, toca Blind Guardian - Bards Song!
Considerações finais
As arrow functions realmente vieram para se tornar parte permanente do Javascript, são amplamente usadas em diversos frameworks, encorajadas no paradigma funcional mas realmente não é a bala de prata, devido as suas limitações (como não poder ser usada como construtora).
Você deve avaliar a sua necessidade, apesar de que, em aplicações modernas, você vai poder usar quase que em 100% das vezes. Até o próximo post!