Antes de dar uma definição formal das funções de ordem superior em Javascript, vamos entender onde elas podem ser úteis e por que usá-las.
Em um certo sistema,diversas operações de divisão de arrays são necessárias.
Essa é uma das maneiras de implementar essas operações:
Obviamente essa solução é péssima, praticamente todo o código é repetido, bugs conseguem se esconder facilmente e se caso a lógica mude, alguém vai precisar encontrar todas as funções e alterar uma por uma.
Existem várias soluções melhores pra esse problema e uma delas é utilizar funções de ordem superior, que é o que vamos fazer a seguir.
O que são funções de ordem superior?
Uma função de ordem superior, ou higher order function (HOF), como vamos chama-la, é uma função que recebe como argumento, ou retorna uma função. Isso é possível porque em Javascript, funções são entidades de primeira classe, ou seja, é possível passar elas como argumentos para uma outra função.
Mas por que HOFs são importantes? Elas são ótimas ferramentas para evitar repetição desnecessária e seguir princípios como o DRYe KISS.
Como usar em Javascript
Vamos continuar o exemplo anterior, refatorando aquelas funções para uma HOF.
Aqui, toda aparte de copiar o array e iterar sobre ele é separada da lógica, que vai ser passada como argumento quando essa função for chamada.
Agora conseguimos utilizar essa função para fazer o mesmo que antes, mas evitando repetição de código.
Simplificando ainda mais a implementação, podemos refatorar ela novamente:
Espero que agora tenha ficado muito mais claro onde usar essas funções.
HOFs na biblioteca padrão do Javascript
A função copyArrayAndManipulate é muito parecida com uma padrão da linguagem, a Array.forEach e isso não é coincidência, HOFs são utilizadas múltiplas vezes nas funções padrões do JS.
Podemos implementar uma versão mais simples do Array.forEach com os conceitos que aprendemos nesse artigo, que funciona de uma forma muito similar a original.
Conclusão
Funções de ordem superior em Javascript são uma ferramenta extremamente útil para o dia adia, elas são utilizadas em diversos lugares nas funções embutidas no JS e em outras bibliotecas, porém, o conceito pode ser um pouco difícil de se entender.
Aproveite e veja a nossa introdução ao Interceptors Nestjs!