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?

Criar um jogo é muito mais complexo do que parece. São milhares, às vezes, milhões de linhas de código. Isso não é exagero! Apenas o jogo Ultima Online possui 6.006.313 linhas de programação, totalizando 25.103.295 palavras


O primeiro computador a conseguir rodar o jogo Spacewar era o PDP-1, que custava 120 mil dólares e pertencia ao Massachusetts Institute of Technology. O jogo demorou 200 horas para ser desenvolvido, em 1962, e seu criador foi um cientista da computação chamado Steve Russel.


O primeiro jogo a fazer uso de uma Inteligência Artificial foi o Mouse in the Maze, criado em 1955, na União Soviética. Você pode saber mais sobre ele clicando aqui.


O título Asteroids, do Atari, possui recorde de pontuação há 30 anos. Em 1982 um americano chamado Scott Safran atingiu a marca de 41.336.440. Atualmente ele faz parte de um minúsculo grupo de jogadores que conseguiram manter seus recordes por mais de 30 anos.


Street Fighter 2, lançado para o Super Nintendo no início dos anos 90, foi o principal responsável pelo aumento nas vendas deste console. Graças ao sucesso do título nos Arcades e à perfeita adaptação ao console, muitos consumidores adquiriram o SNES para jogarem o título em casa. Saiba mais.