Programação Funcional: O que é o conceito Closure? (JavaScript/TypeScript)

Apr 01 2023
Sempre que escrevemos código, escrevemos funções. Uma função é um bloco de código reutilizável que pode ser chamado em qualquer lugar.
Foto de Cristina Gottardi no Unsplash

Sempre que escrevemos código, escrevemos funções. Uma função é um bloco de código reutilizável que pode ser chamado em qualquer lugar.

Quando chamamos uma função, podemos fornecer entradas para ela como argumentos, ela executa o código e retorna a saída.

O que é o conceito Closure?

O conceito de fechamento é a declaração da função dentro de outra função. Este conceito dá à função interna a capacidade de acessar os estados da função externa (como variáveis ​​e argumentos).

Vamos ver um exemplo de código

const outerFunction = () => {
  const state = 10;

  const printState = () => {
    console.log(state);
  };

  printState();
};

outerFunction(); // print : 10

Declarar uma função dentro de outra nos permite escrever algum código e declarar o que esse código faz ao nomear a função. A vantagem é que nosso código se torna mais declarativo. Agora sabemos o que nosso código faz lendo o nome da função em vez de ler o próprio código.

Código sem fechamento

vamos ver um código sem fechamento

const getFileSeparatorByOs = (os: 'linux' | 'windows', enableOsCheking = true) => {
  if (enableOsCheking) {
    if (os === 'linux') {
      return '/';
    }
    if (os === 'windows') {
      return '\\'
    }
  } else {
    return '/'
  }
};

const linuxSeparator = getFileSeparatorByOs('linux');
console.log(linuxSeparator);

const windowsSeparator = getFileSeparatorByOs('windows');
console.log(windowsSeparator);

const defaultSeparator = getFileSeparatorByOs('windows', false);
console.log(defaultSeparator);

Este código não é realmente complicado de entender, mas podemos torná-lo mais declarativo (fácil de ler).

Código com fechamento

vamos ver um código sem fechamento

const getFileSeparatorByOs = (os: 'linux' | 'windows', enableOsCheking = true) => {
  const getLinuxSeparator = () => '/';
  const getWindowsSeparator = () => '\\';
  const getDefaultSeparator = () => '/';
  
  if (enableOsCheking) {
    if (os === 'linux') {
      return getLinuxSeparator();
    }
    if (os === 'windows') {
      return getWindowsSeparator();
    }
  } else {
    return getDefaultSeparator();
  }
};

const linuxSeparator = getFileSeparatorByOs('linux');
console.log(linuxSeparator);

const windowsSeparator = getFileSeparatorByOs('windows');
console.log(windowsSeparator);

const defaultSeparator = getFileSeparatorByOs('windows', false);
console.log(defaultSeparator);

Conclusão

O conceito de fechamento está declarando uma função dentro de outra para dar acesso aos estados da função externa.

Se você é fascinado por programação funcional, aqui está meu artigo sobre a função curryfication https://link.medium.com/JAoSkvB3Byb

Se este artigo foi útil para você, dê um like. E, se você gosta de conceitos de programação que permitem codificar de forma limpa, assine agora, para não perder nada.