OlĂĄ Habr! Apresento a vocĂȘ a tradução do artigo "
Quando (e por que) vocĂȘ deve usar as funçÔes de seta ES6 - e quando nĂŁo deve ", de Cynthia Lee.
As funçÔes de seta são o recurso mais popular do ES6. Esta é uma maneira nova e concisa de escrever funçÔes.
function timesTwo(params) { return params * 2 } timesTwo(4);
Agora o mesmo com a função de seta.
var timesTwo = params => params * 2 timesTwo(4);
Muito mais curto! Podemos omitir chaves e a declaração de retorno (se não houver bloco, mas mais sobre isso posteriormente).
Vamos descobrir como o novo método difere do método usual.
Sintaxe
A primeira coisa que vocĂȘ notarĂĄ rapidamente sĂŁo as vĂĄrias variaçÔes de sintaxe. Vejamos os principais:
1. Sem parĂąmetros
Se a função nĂŁo tiver parĂąmetros, vocĂȘ pode simplesmente escrever parĂȘnteses vazios antes de =>
() => 42
Na verdade, vocĂȘ pode ficar sem suportes!
_ => 42
1. Um parĂąmetro
Os parĂȘnteses tambĂ©m sĂŁo opcionais
x => 42 || (x) => 42
3. VĂĄrios parĂąmetros
Aqui precisamos de parĂȘnteses
(x, y) => 42
4. InstruçÔes
Geralmente, uma expressão funcional retorna um valor, enquanto uma instrução é responsåvel pela ação.
Deve-se lembrar que, no caso de funçÔes de seta, se tivermos um conjunto de açÔes / instruçÔes, devemos usar chaves e a declaração de retorno.
Aqui estå um exemplo de função de seta usada com a instrução if:
var feedTheCat = (cat) => { if (cat === 'hungry') { return 'Feed the cat'; } else { return 'Do not feed the cat'; } }
5. O corpo do bloco fĂșngico
Mesmo que sua função simplesmente retorne valores, mas seu corpo esteja entre chaves, a instrução de retorno é necessåria.
var addValues = (x, y) => { return x + y }
6. literal do objeto
Se a função retornar um literal de objeto, ela deverĂĄ estar entre parĂȘnteses.
x =>({ y: x })
FunçÔes de seta - anÎnimas
Observe que as funçÔes das setas sĂŁo anĂŽnimas; elas nĂŁo tĂȘm um nome.
Isso cria algumas dificuldades:
- DifĂcil de degradar
Quando isso acontece, vocĂȘ nĂŁo poderĂĄ rastrear o nome da função e o nĂșmero da linha onde ocorreu o erro.
- NĂŁo pode ser atribuĂdo a uma variĂĄvel
Se vocĂȘ precisar de um link dentro da função para algo (recursĂŁo, um manipulador de eventos que precisa ser desfeito), nada funcionarĂĄ
Principal vantagem: nĂŁo isso
Nas funçÔes regulares, isso indica o contexto em que essa função é chamada. essa função da seta é a mesma do ambiente em que a função seta é declarada.
Por exemplo, veja a função setTimeout abaixo:
No exemplo acima, vocĂȘ deve usar .bind (this) para passar o contexto para a função. Caso contrĂĄrio, isso serĂĄ indefinido.
Neste exemplo, vocĂȘ nĂŁo precisa vincular isso. A função de seta retira isso do fechamento.
Quando usar as funçÔes de seta
Agora, acho, ficou claro que as funçÔes de seta não substituem as comuns.
Aqui estĂŁo alguns exemplos em que Ă© improvĂĄvel que vocĂȘ queira usĂĄ-los.
1. Métodos de objeto
Quando vocĂȘ chama cat.jumps, o nĂșmero de vidas nĂŁo diminui. Isso ocorre porque isso nĂŁo estĂĄ vinculado a nada e herda o valor do fechamento.
var cat = { lives: 9, jumps: () => { this.lives--; } }
2. FunçÔes de retorno de chamada com contexto dinùmico
Se vocĂȘ precisar de um contexto dinĂąmico, uma função de seta Ă© uma opção ruim.
var button = document.getElementById('press'); button.addEventListener('click', () => { this.classList.toggle('on'); });
Se clicarmos no botĂŁo, obtemos um TypeError. Isso ocorre porque isso nĂŁo estĂĄ vinculado a um botĂŁo.
3. Quando a legibilidade do cĂłdigo piora
Com as funçÔes usuais, fica sempre claro o que vocĂȘ queria dizer. Com pontas de seta, dadas as variadas opçÔes de sintaxe, algumas coisas se tornam menos Ăłbvias.
Quando exatamente vale a pena usar as funçÔes de seta
As funçÔes de seta sĂŁo Ăłtimas para casos em que vocĂȘ nĂŁo precisa do seu prĂłprio contexto de função.
Também gosto muito de usar as funçÔes de seta em todos os tipos de
map
e
reduce
- o cĂłdigo lĂȘ dessa maneira melhor.