Sobes.tech
Junior

K jakým důsledkům může vést deklarace proměnné pomocí var uvnitř funkce?

sobes.tech AI

Odpověď od AI

Deklarace proměnné pomocí var uvnitř funkce má funkční rozsah. To znamená, že taková proměnná je dostupná v celé funkci, ignorujíc blokové rozsahy (například uvnitř if nebo for).

Důsledky:

  • Přepsání proměnných: Proměnná deklarovaná pomocí var v bloku může přepsat jinou proměnnou se stejným jménem deklarovanou dříve ve stejné funkci, ale mimo tento blok.
  • Hoisting (zvednutí): Deklarace proměnné pomocí var je zvednuta na začátek funkce. To znamená, že proměnnou lze použít před jejím deklarováním, ale její hodnota v té chvíli bude undefined.
  • Nečekané chování v cyklech: V cyklech for s asynchronními operacemi (například setTimeout) bude proměnná deklarovaná pomocí var mít poslední hodnotu cyklu pro všechny asynchronní callbacky, nikoliv hodnotu v okamžiku iterace.

Příklad zvednutí a přepsání:

function prikladScopeVar() {
  console.log(a); // undefined (kvůli hoistingu)
  var a = 10;
  if (true) {
    var a = 20; // Přepíše vnější proměnnou 'a'
    console.log(a); // 20
  }
  console.log(a); // 20 (hodnota z bloku if)
}

prikladScopeVar();

Příklad s cyklem a asynchronními operacemi:

function prikladCyklusVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // Vytiskne 3, 3, 3 (i má poslední hodnotu cyklu)
    }, 100);
  }
}

prikladCyklusVar();

Vzhledem k těmto vlastnostem se doporučuje používat let nebo const, které mají blokový rozsah, aby se předešlo neočekávaným situacím.