Funções e dados · unidade 5 de 27

Closures

Uma função pode continuar carregando contexto.

6 min de leitura · 7 cards · 16 exercícios

Card 1 de 7: Closures01 / 07

Leitura

Estado privado, rate limiting e memoização a partir de uma das ideias mais importantes do JavaScript.

No backend, esse fundamento aparece quando o código transforma entrada em decisão. O detalhe de linguagem deixa de ser acadêmico no momento em que altera um payload, uma regra de negócio ou a forma como uma falha chega à camada seguinte.

A forma mais útil de estudar é ligar a sintaxe a um contrato observável: o que entra, o que pode mudar, qual resultado sai e qual erro deve continuar o fluxo. É esse raciocínio que os exemplos e exercícios desta unidade procuram treinar.

Código

exemplo.js
function makeCounter() {
  let count = 0
  return () => ++count
}

O que fica

  • A closure mantém acesso à variável, não a uma fotografia.
  • Cada fábrica pode produzir seu próprio estado privado.
  • Let cria um binding por iteração em loops.

Prática guiada.Leia, rode, quebre e explique cada exercício.

Prática guiada / unidade 05

Um problema de cada vez.

Leia o contrato, escreva sua tentativa e confira os casos esperados. A resolução de referência permanece visível ao final de cada exercício.

Fundamentalexercício 01 / 16

makeCounter(start)

01 / Entenda

Enunciado

retorna uma função increment() sem parâmetros. Cada chamada soma 1 a um contador privado (que começa em start, default 0) e retorna o novo valor.

02 / Implemente

Sua tentativa

Comece pela assinatura e resolva sem olhar a resposta.

ponto de partida
function makeCounter(start = 0) {
  // Escreva sua solução aqui.
}

03 / Preveja

Entrada e saída

Use estes exemplos para entender o contrato antes de programar.

Entrada / chamada

makeCounter(5)

Retorno esperado

incrementa a partir de start

04 / Teste

Prove que funciona

O teste chama sua função e compara o resultado real com o esperado.

Como utilizar este teste

  1. 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
  2. 02Salve sua implementação em exercises.js, na mesma pasta do teste.
  3. 03Abra o terminal nessa pasta e execute o comando abaixo.
  4. 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="makeCounter" exercises.test.js

Comportamentos cobertos

  • incrementa a partir de start
  • default start é 0 e contadores são independentes
Ver código completo do teste
test("makeCounter: incrementa a partir de start", () => {
  const counter = makeCounter(5);
  assert.equal(counter(), 6);
  assert.equal(counter(), 7);
});

test("makeCounter: default start é 0 e contadores são independentes", () => {
  const a = makeCounter();
  const b = makeCounter();
  assert.equal(a(), 1);
  assert.equal(a(), 2);
  assert.equal(b(), 1);
});

Ainda travou?

Dicas graduais

Nível 1 — direção, sem código

Para makeCounter: onde a variável que guarda o valor atual precisa ser declarada para que a função retornada consiga lê-la e alterá-la a cada chamada, mas ninguém de fora consiga acessá-la diretamente?

Nível 2 — pista mais direta

makeCounter: let value = start; return () => { value += 1; return value; };

05 / Compare

Resolução

Esta área permanece livre em todos os exercícios. O código atual da unidade aparece abaixo para comparação com os testes e casos esperados.
código disponível
function makeCounter(start = 0) {
  let count = start;
  return function increment() {
    count++;
    return count;
  };
}