trilha

Tecnologias/01 - Linguagens/02 - TypeScript2 min

JavaScript, Referências e Closures

Valores e referências

A execução de TypeScript segue a semântica de JavaScript. Quando duas variáveis recebem o mesmo objeto, elas podem acessar a mesma instância. Alterar uma propriedade por uma delas fica visível pela outra.

const original = { nome: "Ana", endereco: { cidade: "Recife" } };
const alias = original;
alias.nome = "Bia";
console.log(original.nome); // Bia

const copia = { ...original };
copia.endereco.cidade = "Natal";
console.log(original.endereco.cidade); // Natal

O spread criou outro objeto externo, mas copiou a referência de endereco. Essa é uma cópia rasa. Copiar uma estrutura inteira exige considerar também os valores aninhados. const impede reatribuir a variável; não congela o objeto. Referência: spread syntax.

Closure

Uma closure é uma função associada ao ambiente léxico em que foi criada. A função continua acessando variáveis desse ambiente mesmo depois que a chamada externa termina.

function criarSequencia() {
  let atual = 0;
  return () => {
    atual += 1;
    return atual;
  };
}

const proximo = criarSequencia();
console.log(proximo()); // 1
console.log(proximo()); // 2

Cada chamada de criarSequencia() cria um ambiente próprio. A função retornada conserva o acesso a atual, permitindo encapsular estado sem expor a variável diretamente. Referência: closures.

Consequência prática

Uma closure pode manter um objeto grande acessível por mais tempo do que o esperado. Se um callback registrado continuar referenciando esse objeto, ele pode continuar alcançável para o coletor de lixo. Remover a anotação de tipos não altera esse comportamento.

Aprofundamento aplicado

Atualização imutável e identidade

Copiar apenas o caminho alterado evita modificar o objeto original:

const antes = { nome: "Ana", endereco: { cidade: "Recife" } };
const depois = {
  ...antes,
  endereco: { ...antes.endereco, cidade: "Natal" },
};
console.log(antes.endereco.cidade); // Recife
console.log(antes.endereco === depois.endereco); // false

Esse exemplo cria uma nova identidade para endereco. Em estruturas maiores, ramos não modificados podem continuar compartilhados, desde que ninguém os altere depois. A escolha entre copiar e modificar depende de quem possui o objeto e de quem observa sua identidade. Uma cópia rasa não é uma operação de isolamento universal.

Capturar uma variável ou calcular um valor

let pontos = 1;
const lerAtual = () => pontos;
const mensagem = `Pontos: ${pontos}`;
const lerMensagem = () => mensagem;
pontos = 2;
console.log(lerAtual());    // 2
console.log(lerMensagem()); // Pontos: 1

A primeira função lê a variável no momento da chamada. A segunda lê um texto que já foi calculado. Esse contraste explica callbacks que exibem um estado antigo sem que haja erro no mecanismo de closures.

Exercício: crie duas sequências com criarSequencia(). Intercale as chamadas. Resultado esperado: cada instância mantém seu próprio contador; chamadas da mesma instância compartilham a mesma variável.

Referência: ambientes léxicos e closures.

Relacionado: 4. Mutabilidade · 3. Passagem por Valor vs por Referência · 6. Promises, Async-Await e Erros.


Parte de TypeScript

Buscar

Busca por título, seção e texto das notas