Sobes.tech
Junior

A que consequências pode levar a declaração de uma variável usando var dentro de uma função?

sobes.tech IA

Resposta da IA

A declaração de uma variável com var dentro de uma função tem um âmbito funcional. Isso significa que essa variável está disponível em toda a função, ignorando os escopos de bloco (por exemplo, dentro de if ou for).

Consequências:

  • Sobrescrever variáveis: Uma variável declarada com var num bloco pode sobrescrever uma variável com o mesmo nome declarada anteriormente na mesma função, mas fora desse bloco.
  • Elevação (Hoisting): A declaração de uma variável com var é elevada ao início da função. Isso significa que pode usar a variável antes de sua declaração, mas seu valor nesse momento será undefined.
  • Comportamento inesperado em ciclos: Em ciclos for com operações assíncronas (por exemplo, setTimeout), a variável declarada com var terá o último valor do ciclo para todos os callbacks assíncronos, não o valor no momento da iteração.

Exemplo de elevação e sobrescrita:

function exemploEscopoVar() {
  console.log(a); // undefined (por causa do hoisting)
  var a = 10;
  if (true) {
    var a = 20; // Sobrescreve a variável externa 'a'
    console.log(a); // 20
  }
  console.log(a); // 20 (valor do bloco if)
}

exemploEscopoVar();

Exemplo com ciclo e operações assíncronas:

function exemploCicloVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // Vai imprimir 3, 3, 3 (i tem o último valor do ciclo)
    }, 100);
  }
}

exemploCicloVar();

Devido a essas características, para evitar situações imprevistas, recomenda-se usar let ou const, que têm escopo de bloco.