DEV Community

Cover image for Javascript Essentials 101: Higher-Order Functions, Currying, and Partial Application
João Pedro
João Pedro

Posted on • Edited on

Javascript Essentials 101: Higher-Order Functions, Currying, and Partial Application

JavaScript Essentials 101: Higher-Order Functions, Currying e Partial Application

Introdução

Nesse artigo vamos abordar conceitos fundamentais—técnicas e estruturas que sempre fizeram parte do JavaScript e são essenciais para escrever código limpo e eficiente. Mesmo que esses conceitos pareçam avançados, pense neles como parte do DNA do JavaScript.

Por que isso é importante?

Talvez você nunca tenha ouvido falar de higher-order functions, currying ou partial application, mas esses são conceitos fundamentais que tornam o código mais eficiente, reutilizável e escalável. Seja manipulando dados, otimizando chamadas de funções ou lidando com lógica complexa, essas técnicas são essenciais para entender o lado funcional do JavaScript.

Vamos explorar esses conceitos com exemplos práticos que mostram o quão úteis e poderosos eles são.


Higher-Order Functions

Uma higher-order function é qualquer função que recebe outra função como argumento ou retorna uma função como resultado. Essas funções são parte essencial do JavaScript, pois permitem aplicar técnicas de programação funcional, tornando a manipulação de dados mais limpa e intuitiva.

Exemplo: Vamos analisar map, filter e reduce, três higher-order functions que transformam arrays com uma sintaxe concisa:

const numbers = [1, 2, 3, 4, 5];

// Usando map para dobrar cada número
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

// Usando filter para obter apenas os números pares
const evens = numbers.filter(num => num % 2 === 0);
console.log(evens); // [2, 4]

// Usando reduce para somar todos os números
const sum = numbers.reduce((acc, num) => acc + num, 0);
console.log(sum); // 15
Enter fullscreen mode Exit fullscreen mode

Currying

Currying transforma uma função com múltiplos argumentos em uma sequência de funções, cada uma recebendo um único argumento. Essa técnica é útil para dividir operações complexas em partes menores e reutilizáveis, tornando o código mais modular.

Exemplo: Aqui está uma função de soma utilizando currying:

const add = a => b => a + b;
const addFive = add(5);

console.log(addFive(3)); // 8
console.log(addFive(10)); // 15
Enter fullscreen mode Exit fullscreen mode

Com currying, criamos a função addFive a partir de add, permitindo reutilizar essa operação específica em diferentes partes do código.


Partial Application

Partial application é semelhante ao currying, mas permite preencher alguns argumentos de uma função, deixando os demais dinâmicos. Essa abordagem é útil para tarefas repetitivas com parâmetros fixos.

Exemplo: Vamos aplicar uma taxa de imposto de 20% a diferentes preços:

const applyTax = (rate, price) => price * (1 + rate);
const applyVAT = applyTax.bind(null, 0.2); // Define taxa fixa de 20%

console.log(applyVAT(100)); // 120
console.log(applyVAT(200)); // 240
Enter fullscreen mode Exit fullscreen mode

Aqui, applyVAT permite calcular rapidamente os preços com uma taxa de imposto fixa, tornando o código mais enxuto e legível.


Conclusão

Essas funções podem parecer "avançadas", mas são ferramentas essenciais para dominar o JavaScript. Ao entender higher-order functions, currying e partial application, você escreverá código mais limpo, eficiente e fácil de testar e manter. No próximo capítulo, continuaremos explorando esses conceitos para desbloquear todo o potencial do JavaScript. Continue estudando—você está investindo em fundamentos que elevarão suas habilidades e confiança como desenvolvedor.

Top comments (0)