Sobes.tech
Junior

K akým dôsledkom môže viesť deklarácia premennej pomocou var vo vnútri funkcie?

sobes.tech AI

Odpoveď od AI

Deklarácia premennej s var vnútri funkcie má funkčný rozsah. To znamená, že takáto premenná je dostupná v celej funkcii, ignorujúc blokové rozsahy (napríklad vo vnútri if alebo for).

Dôsledky:

  • Prepísanie premenných: Premenná deklarovaná s var v bloku môže prepísať rovnakú premennú deklarovanú skôr v tej istej funkcii, ale mimo tohto bloku.
  • Hoisting (zdvihnutie): Deklarácia premennej s var je zdvihnutá na začiatok funkcie. To znamená, že môžete použiť premennú pred jej deklaráciou, ale jej hodnota v tom momente bude undefined.
  • Neočakávané správanie v cykloch: V cykloch for s asynchrónnymi operáciami (napríklad setTimeout) bude premená s var mať poslednú hodnotu z cyklu pre všetky asynchrónne callbacky, nie hodnotu v momente iterácie.

Príklad zdvihnutia a prepísania:

function prikladScopeVar() {
  console.log(a); // undefined (kvôli hoistingu)
  var a = 10;
  if (true) {
    var a = 20; // Prepíše vonkajšiu premennú 'a'
    console.log(a); // 20
  }
  console.log(a); // 20 (hodnota z bloku if)
}

prikladScopeVar();

Príklad s cyklom a asynchrónnymi operáciami:

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

prikladCyklusVar();

Vzhľadom na tieto vlastnosti sa odporúča používať let alebo const, ktoré majú blokový rozsah, na zabránenie neočakávaných situácií.