Aprenda Closures e Currying: Técnicas Avançadas em JS

Neste tutorial, vamos explorar dois conceitos fundamentais e avançados de JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.: closures e currying. Ambos estão diretamente relacionados à forma como o JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente. lida com funções e escopos, trazendo poder e flexibilidade ao desenvolvimento de aplicações web.

1. Visão Geral🔗

As closures são formadas quando uma função interna “lembra” o ambiente em que foi criada (escopo léxico), mesmo após a funçãoFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. externa ter sido finalizada. Já o currying concentra-se em transformar funções que recebem vários parâmetros em uma sequência de chamadas de função, cada uma recebendo um único parâmetro. Entender esses conceitos é essencial para criar código mais modular, reutilizável e expressivo em JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente..

2. Entendendo Closures🔗

2.1 O que é uma Closure?

Uma closure ocorre quando uma função interna tem acesso às variáveis da função externa que a contém, mesmo depois que a função externa já foi executada. Em outras palavras, a função interna “fecha” (encapsula) as variáveisPré-processadores (SASS/SCSS): Variáveis, Mixins, NestingPré-processadores (SASS/SCSS): Variáveis, Mixins, NestingAprenda a manter seu CSS de forma otimizada com SASS/SCSS utilizando variáveis, mixins e nesting para um código limpo e produtivo. em seu escopo.

TermoSignificado
Escopo LéxicoAs variáveis são resolvidas no escopo em que a função foi declarada, não onde ela é executada.
Função InternaFunção declarada dentro de outra função.
ClosureConjunto de referências às variáveis do escopo externo, retidas pela função interna.

2.2 Exemplo de Closure

Imagine um cenário em que temos uma funçãoFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. gerarContador que cria um contador e retorna uma funçãoFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. interna capaz de manipular o valor desse contador:

function gerarContador() {
  let contador = 0;
  return function() {
    contador++;
    console.log(`Contador atual: ${contador}`);
  };
}
const contador1 = gerarContador();
contador1(); // Contador atual: 1
contador1(); // Contador atual: 2

Embora a funçãoFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. gerarContador já tenha sido executada, a função retornada ainda tem acesso à variávelPré-processadores (SASS/SCSS): Variáveis, Mixins, NestingPré-processadores (SASS/SCSS): Variáveis, Mixins, NestingAprenda a manter seu CSS de forma otimizada com SASS/SCSS utilizando variáveis, mixins e nesting para um código limpo e produtivo. contador. Isso é possível graças à closure formada. Cada chamada de contador1() atualiza e exibe o valor de contador, que persiste de invocação em invocação.

2.3 Por que as Closures são úteis?

3. Currying🔗

3.1 Conceito de Currying

O currying é uma técnica de refatoração de funções que transformam funções que recebem vários parâmetrosFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. em uma sequência de chamadas de função, cada qual recebendo apenas um parâmetro. Por exemplo, uma função que recebe três argumentos (a, b, c) seria transformada em três chamadas sucessivas:

$$ f(a, b, c) \rightarrow f(a)(b)(c) $$

No JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente., isso resulta em uma série de funções aninhadas, onde cada função retorna outra função, até que todos os argumentos necessários sejam fornecidos.

3.2 Exemplo Prático de Currying

Abaixo temos uma funçãoFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. tradicional de soma de três números e em seguida sua versão curried.

// Função tradicional
function soma(a, b, c) {
  return a + b + c;
}
console.log(soma(1, 2, 3)); // 6
// Versão curried
function somaCurried(a) {
  return function(b) {
    return function(c) {
      return a + b + c;
    };
  };
}
console.log(somaCurried(1)(2)(3)); // 6

Observe que em sua forma curried, a funçãoFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. recebe um argumento de cada vez. Isso pode parecer mais complexo à primeira vista, mas traz benefícios interessantes.

3.3 Vantagens do Currying

1. Reutilização e ParâmetrosFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. Parciais: Podemos fixar determinados parâmetrosFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. sem precisar declará-los repetidamente.

const somaCom10 = somaCurried(10);
console.log(somaCom10(5)(2)); // 17
console.log(somaCom10(20)(5)); // 35

Aqui, fixamos o primeiro argumento em 10, criando uma funçãoFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. especializada para somar 10 a qualquer outro par de valores.

2. Composição de FunçõesFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas.: Facilita criar funçõesFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. mais genéricas que podem ser encadeadas para formar comportamentos complexos de forma clara e expressiva.

3. Organização: Ajuda a organizar funçõesFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. em blocos lógicos menores, favorecendo a lógica funcional e a previsibilidade.

4. Combinação de Closures e Currying🔗

Closures e currying podem ser usados juntos para criar lógicas poderosas. Por exemplo, podemos “lembrar” de um valor específico e, ao mesmo tempo, produzir uma cadeia de funçõesFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. para transformar esse valor:

function taxasBasicas(imposto) {
  return function(custoBase) {
    // Armazena imposto por meio de closure
    const valorImposto = imposto;
    // Retorna função curried para aplicar incrementos
    return function(adicional) {
      return custoBase + adicional + valorImposto;
    };
  };
}
const impostoBrasil = taxasBasicas(7.5);      // 7.5 é a taxa
const custoVeiculo = impostoBrasil(10000);    // custo base de 10000
console.log(custoVeiculo(500)); // 10000 + 500 + 7.5 = 10507.5

5. Resumo e Dicas Práticas🔗

Essa compreensão aprofundada de closures e currying permite escrever um JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente. mais expressivo, seguro e manutenível. A prática é fundamental: experimente alterar exemplos, criar suas próprias funçõesFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. internas, e explore diferentes maneiras de aplicar currying no seu dia a dia de desenvolvimento.

Conclusão🔗

As closures oferecem a habilidade de reter dados em escopos que persistem após a execução de uma funçãoFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas., enquanto o currying permite criar funçõesFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. altamente especializadas e maleáveis. Juntos, esses conceitos ampliam o poder da linguagem e dão ao desenvolvedor ferramentas para construir aplicações mais organizadas, modulares e robustas.

Siga praticando a criação de closures e currying em diferentes contextos para entender o grande potencial desses recursos e integrá-los de forma natural ao seu fluxo de desenvolvimento.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados