Sobes.tech
Junior

Qual é a diferença entre um encerramento e um escopo?

sobes.tech IA

Resposta da IA

O encerramento é uma função que lembra o ambiente (âmbito léxico) em que foi criada, mesmo que seja executada fora desse ambiente. Isso permite-lhe aceder a variáveis do âmbito pai.

O âmbito é a área do programa onde uma variável ou função é visível e acessível. Em JavaScript, existem âmbito global, funcional e de bloco.

Diferença principal:

  • Âmbito determina onde uma variável ou função está disponível durante a compilação (ou análise).
  • Encerramento permite a uma função manter acesso às variáveis do seu âmbito de criação depois de esse âmbito ter terminado a sua execução.

Exemplo de âmbito:

// Âmbito global
let globalVar = "Sou global";

function minhaFuncao() {
  // Âmbito funcional
  let functionVar = "Sou funcional";
  console.log(globalVar); // Disponível
}

// console.log(functionVar); // Erro ReferenceError: functionVar não definido

Exemplo de encerramento:

function criarContador() {
  let count = 0; // Variável no âmbito de criarContador

  return function() { // Isto é um encerramento
    count++; // Tem acesso a count do âmbito pai
    console.log(count);
  };
}

const contador = criarContador();
contador(); // Imprime 1 (count mantém-se)
contador(); // Imprime 2 (count mantém-se)
// console.log(count); // Erro ReferenceError: count não definido

Neste exemplo, a função interna (encerramento) mantém o acesso à variável count, mesmo após criarContador ter terminado a sua execução. Isto é possível graças ao encerramento.

Comparação:

Característica Âmbito Encerramento
O que determina Onde as variáveis e funções estão disponíveis Como uma função mantém o acesso às variáveis do âmbito pai
Quando está ativo Durante a compilação (ambiente léxico) Durante a execução da função criada noutra área de âmbito
Relação O encerramento depende do âmbito em que foi criado O âmbito é um conceito fundamental para determinar a acessibilidade