Você já aprendeu o que são closures no JavaScript: funções que “lembram” do escopo onde foram criadas.

Agora chegou a hora de ir além do conceito básico e entender:

por que closures são usadas em código profissional e arquiteturas reais.

🎯 Objetivo da aula

Ao final desta aula, você será capaz de:

  • Entender closures como mecanismo de estado
  • Usar closures para encapsulamento
  • Evitar armadilhas comuns
  • Reconhecer closures em bibliotecas reais
  • Usar closures de forma intencional

Relembrando o básico (rapidamente)

Uma closure acontece quando:

  • Uma função é criada dentro de outra
  • A função interna acessa variáveis externas
  • Essas variáveis continuam acessíveis após a execução
 
  function externa() 
  { 
    let mensagem = "Olá";
    function interna() 
    {
      console.log(mensagem);
    }
    return interna;
  }
  const fn = externa();
  fn(); // Saída será: Olá

Closure ≠ truque

Closure não é um “efeito colateral”.

Ela é uma consequência direta de como:

  • Escopos funcionam
  • Funções são valores
  • O Call Stack libera contextos
O escopo léxico é preservado mesmo após a execução da função externa.

Caso 1 — Closure como estado privado

Closures permitem criar estado sem usar variáveis globais.

 
  function criarContador() 
  { 
    let contador = 0;
    return function () 
    {
      contador++;
      return contador;
    };
  }
  const contar = criarContador();
  console.log(contar()); // Saída será 1
  console.log(contar()); // Saída será 2
  console.log(contar()); // Saída será 3

Aqui:

  • contador é privado
  • Só a função interna pode acessá-lo
  • O valor é preservado entre chamadas

Por que isso é poderoso?

Porque você consegue:

  • Encapsular estado
  • Evitar poluição global
  • Controlar acesso aos dados
Isso é base de frameworks, bibliotecas e módulos

Caso 2 — Closure para configuração

Muito comum em código real:

 
  function criarSaudacao(prefixo) 
  { 
    return function (nome) 
    { 
      console.log(prefixo + ", " + nome); 
    }; 
  }
  const ola = criarSaudacao("Olá");
  const bomDia = criarSaudacao("Bom dia");
  ola("Daniel"); // Saída será: Olá, Daniel
  bomDia("Daniel"); // Saída será: Bom dia, Daniel

A função interna “lembra” do prefixo.

Caso 3 — Closure em loops (armadilha clássica)

Observe este código:

 for (var i = 1; i <= 3; i++) { setTimeout(() => { console.log(i); }, 100); } 
 console.log(i); // Saída será: // 4 // 4 // 4 

Por quê?

  • var não tem escopo de bloco
  • A closure captura a variável, não o valor

Correção com let

 for (let i = 1; i <= 3; i++) { setTimeout(() => { console.log(i); }, 100); } 
 console.log(i); // Saída será: // 1 // 2 // 3 
let cria um novo escopo a cada iteração.

Caso 4 — Closure como fábrica de funções

Closures são muito usadas para criar funções especializadas.

 
  function multiplicador(fator) 
  { 
    return function (numero) 
    { 
      return numero * fator; 
    }; 
  }
  const dobrar = multiplicador(2);
  const triplicar = multiplicador(3);
  console.log(dobrar(5)); // Saída será 10
  console.log(triplicar(5)); // Saída será 15

Closures em bibliotecas reais

Você usa closures o tempo todo sem perceber:

  • Event listeners
  • Hooks (React)
  • Middlewares
  • Factories
Closure é o mecanismo por trás da maioria das abstrações modernas.

Quando tomar cuidado

  • Closures podem manter dados vivos na memória
  • Uso excessivo pode dificultar debug
  • Use quando há real necessidade de estado persistente

Resumo da aula para nunca mais esquecer

  • Closures preservam o escopo léxico
  • Funções lembram do ambiente onde nasceram
  • Closures permitem estado privado
  • São base de módulos e abstrações
  • Não são truque — são arquitetura

Na próxima aula, vamos para outro pilar do JavaScript moderno: Imutabilidade.


HARDWARE

Entendendo o seu computador

O que há dentro do meu computador?

Existem alguns componentes fundamentais presentes dentro do seu computador e é muito importante que você conheça um pouco sobre eles, seja para argumentar com algum vendedor durante a compra de um novo PC ou para identificar alguma atitude desleal de algum técnico que esteja te passando um orçamento para reparo. Na seção Raio-X aqui do Contém Bits você pode conhecer e entender mais detalhadamente sobre cada componente, ou também pode clicar abaixo no componente que deseja, para conhecê-lo melhor.

  • Gabinetes

  • Placas-Mãe

  • Processadores

  • Memória

  • Fontes

  • Drives Ópticos

  • Discos Rígidos

  • SSD

  • Placas de Som

  • Placas de Vídeo

Você Sabia?

O ENIAC, primeiro computador valvulado do mundo, possuía 17.000 válvulas, 500.000 pontos de solda, 30 toneladas de peso e ocupava uma área de 180 metros quadrados. Clique aqui e conheça mais sobre a história dos computadores.


O épico jogo River Raid, do Atari, foi desenhado e boa parte de sua programação foi feita por uma mulher: Carol Shaw, uma excelente programadora e funcionária da Activision em 1982. Saiba mais sobre a história deste incrível jogo, aqui.


As primeiras máquinas de fliperama do mundo a utilizarem moedas, chamadas de Galaxy Game, custavam mais de 20 mil dólares para serem produzidas. Saiba mais sobre elas aqui.


Apenas no ano de 1982, o clássico Pac Man vendeu mais de 400 mil máquinas de fliperama em todo o mundo e recebeu cerca de 7 bilhões de moedas nestas máquinas. Saiba mais.


Ao completar o nível 99 do jogo Duck Hunt, para Nintendo, o jogo retorna ao primeiro nível, mas um bug impede que se acerte os patos neste recomeço. Este é um exemplo do que é chamado no mundo dos games de "Kill Screen".