Funções e dados · unidade 5 de 27
Closures
Uma função pode continuar carregando contexto.
01 / 07Use as setas do teclado ou deslize
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
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.
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.
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 start04 / Teste
Prove que funciona
O teste chama sua função e compara o resultado real com o esperado.
Como utilizar este teste
- 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
- 02Salve sua implementação em
exercises.js, na mesma pasta do teste. - 03Abra o terminal nessa pasta e execute o comando abaixo.
- 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="makeCounter" exercises.test.jsComportamentos 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
function makeCounter(start = 0) {
let count = start;
return function increment() {
count++;
return count;
};
}