🏹E tem diferença entre Arrow function e function?


Quando comecei a estudar ReactJS uma das questões que mais me encantou na linguagem foi a estrutura bem mais clara para entendimento de funções. Eu tinha acabado de passar por um turbulento e desafiador período de transição da programação estruturada para a programação orientada a objetos e estava um pouco desiludida com a programação, pois tudo parecia ser um conjunto de hieróglifos indecifráveis.

Nos primeiros cursos de ReactJS comecei ~~finalmente~~ a entender os conceitos de classes e objetos e mal sabia eu que estava sendo apresentada a Programação funcional. (fui ligar o nome ao paradigma anos mais tarde ...)

Com a chegada do ES6 todos os cursos que estava fazendo de ReactJS passaram a usar Arrow Function. Para mim foi amor instantâneo!! A estrutura se mostrou tão simples que pela primeira vez adotei em meus projetos sem procurar o conceito por trás.

💡 Uma nota sobre a forma como aprendo ... sou o tipo de pessoa que para internalizar um novo conceito precisa entender a origem, como funciona, porque uso, como uso e o que é esperado. Isso é algo que as vezes torna minha curva de aprendizagem um pouco mais longa pois não consigo apenas "usar" um determinado elemento se não souber o que ele realmente faz. E toda vez que apenas uso algo sem saber exatamente porque estou usando, tu pode ter certeza que vou esquecer rapidão como aplicar ...

Bom, voltando a Arrow Function ... Apesar de ser uma estrutura que utilizo de forma bem recorrente, em alguns momentos o uso de uma function tradicional me parecia fazer mais sentido no código ... mas, não sabia muito porque a escolha por uma ou outra forma... E então chegou o momento de ~~tentar~~ entender as diferenças ...

Arrow function é uma sugar syntax de function que foi incluido no es6. Mas vamos as diferenças ...

Lexical scope this

Quando comecei a estudar orientação a objeto o this com certeza era meu maior pesadelo. Assim, o fato do Arrow Function capturar o valor do this do escopo em que se encontra facilitou demais meu aprendizado.

Antes da arrow function, toda função definia seu próprio valor de this considerando a forma como era chamada, no Es3/5 buscou-se corrigir este comportamento com a atribuição do valor de this à uma variável encapsulada .

function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| corretamente se refere ao objeto Person
  }, 1000);
}

var p = new Person();

Arrow Function não é hoisted

De forma bem simplificada, o conceito de hoisted significa poder utilizar uma função antes mesmo dela ser declarada.

tradicional(); // 'Tradicional function'
function tradicional() {
  console.log('Tradicional function');
}

No caso de funções anônimas não temos o benefício do hoisted. Logo, como a Arrow function é sempre uma função anônima (atribuída a uma variável), não temos como chamar uma arrow function antes de sua declaração.

anonymous(); // Exception: TypeError: anonymous is not a function
var anonymous = function() {
  console.log('Anonymous function');
};

arrow(); // Exception: TypeError: arrow is not a function
var arrow = ()=> nsole.log('Arrow function');

Constructor e Arguments

Vamos juntar estes dois itens pois a diferença/motivo em relação a função tradicional é a mesma.

Arrow Functions não pode ser usadas como contrutor e não tem acesso aos argumentos exatamente pela primeira diferença que listei ... lexical scope this.

// Traditional function
var crescente = function() {
  return Array.from(arguments).sort((a, b) => a > b)
}
crescente(3,2,5,1,4,8,7,6); // Array [ 1, 2, 3, 4, 5, 6, 7, 8 ]


// Arrow function
var crescente = () => {
  return Array.from(arguments).sort((a, b) => a > b);
}
crescente(3,2,5,1,4,8,7,6); // Exception: ReferenceError: arguments is not defined

No caso dos argumentos podemos "contornar" usando o spread operator

var crescente = (...arguments) => {}

💡 Não posso deixar de registrar que demorei a internalizar esse spread operator ... eita conceito que não entrava na mente ... 🙄

Bom ... pesquisei bastante sobre o tema, esbarrei em uma série de novos conceitos, mas juntando tudo e analisando prós e contras, não vislumbrei nenhuma diferença que impedisse o uso da arrow function em praticamente todos os cenários de projeto.

Pode ser que daqui a algum tempo eu mude de opinião ou encontre alguma diferença que realmente me impeça de usar o arrow function, mas a verdade que pra mim a Arrow function foi um marco de aprendizado da programação funcional (~~e morte ao this~~ 🤣).

https://medium.com/frontend-quest/arrow-functions-vs-functions-9048ec12b5c6 https://pt.stackoverflow.com/questions/143399/qual-a-diferença-entre-function-e-por-que-não-funciona-o-http-ge