Sobes.tech
Middle

Qual é a diferença entre usar variáveis declaradas com var e let no contexto de closures?

sobes.tech IA

Resposta da IA

A principal diferença reside na área de alcance que criam e, consequentemente, na forma como afetam o valor da variável capturada pelo encerramento.

As variáveis declaradas com var têm um âmbito funcional ou global. Num ciclo, por exemplo, o encerramento captura o último valor da variável var devido ao levantamento (hoisting).

// Exemplo com var
for (var i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i); // Vai imprimir 3 três vezes
  }, 100);
}

As variáveis declaradas com let têm um âmbito de bloco. Num ciclo, let cria uma nova variável para cada iteração, e o encerramento captura o valor da variável para essa iteração específica.

// Exemplo com let
for (let j = 0; j < 3; j++) {
  setTimeout(function() {
    console.log(j); // Vai imprimir 0, 1, 2
  }, 100);
}

No contexto do encerramento, isto significa que um encerramento que captura a variável var referenciará o mesmo local na memória que contém o último valor da variável. Um encerramento que captura a variável let referenciará um local diferente na memória para cada iteração do ciclo.