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