Qual é a definição de uma função de ordem superior?
TL;DR
Uma função de ordem superior é qualquer função que recebe uma ou mais funções como argumentos, as quais ela usa para operar sobre alguns dados, e/ou retorna uma função como resultado.
Funções de ordem superior são destinadas a abstrair alguma operação que é executada repetidamente. O exemplo clássico disso é o Array.prototype.map(), que recebe um array e uma função como argumentos. O Array.prototype.map() então usa essa função para transformar cada item do array, retornando um novo array com os dados transformados. Outros exemplos populares em JavaScript são Array.prototype.forEach(), Array.prototype.filter() e Array.prototype.reduce(). Uma função de ordem superior não precisa apenas manipular arrays, pois existem muitos casos de uso para retornar uma função de outra função. Function.prototype.bind() é um exemplo que retorna outra função.
Vamos supor que temos um array de nomes no qual precisamos transformar cada string em maiúsculas.
A maneira imperativa seria assim:
Use Array.prototype.map(transformerFn) torna o código mais curto e mais declarativo.
Funções de ordem superior
Uma função de ordem superior é uma função que recebe outra função como argumento ou retorna uma função como resultado.
Funções como argumentos
Uma função de ordem superior pode receber outra função como argumento e executá-la.
Neste exemplo, a função greetName é uma função de ordem superior porque ela recebe outra função (greet) como argumento e a usa para gerar uma saudação para o nome fornecido.
Funções como valores de retorno
Uma função de ordem superior pode retornar outra função.
Neste exemplo, a função multiplier retorna uma nova função que multiplica qualquer número pelo fator especificado. A função retornada é uma closure que lembra o valor de factor da função externa. A função multiplier é uma função de ordem superior porque retorna outra função.
Exemplos práticos
- Decorador de logging: Uma função de ordem superior que adiciona funcionalidade de logging a outra função:
A função withLogging é uma função de ordem superior que recebe uma função fn como argumento e retorna uma nova função que registra a chamada da função antes de executar a função original.
- Memoization: Uma função de ordem superior que armazena em cache os resultados de uma função para evitar computações redundantes:
A função memoize é uma função de ordem superior que recebe uma função fn como argumento e retorna uma nova função que armazena em cache os resultados da função original com base em seus argumentos.
- Lodash: Lodash é uma biblioteca utilitária que fornece uma ampla variedade de funções para trabalhar com arrays, objetos, strings e muito mais, sendo a maioria delas funções de ordem superior.
Leitura complementar
- Higher-Order Functions
- Understanding Higher-Order Functions in JavaScript
- Higher Order Functions: How to Use Filter, Map and Reduce for More Maintainable Code