Sobes.tech
Junior

Milyen következményekkel járhat egy változó var használatával történő deklarálása egy függvényen belül?

sobes.tech MI

Válasz az MI-től

Egy függvényen belüli var-ral deklarált változó funkcionális hatókörrel rendelkezik. Ez azt jelenti, hogy ilyen változó az egész függvényben elérhető, figyelmen kívül hagyva a blokk hatóköröket (például if vagy for belül).

Következmények:

  • Változók felülírása: Egy blokkban var-ral deklarált változó felülírhat egy ugyanazzal a névvel korábban deklarált változót ugyanabban a függvényben, de a blokk kívül.
  • Hoisting (felhúzás): A var-ral deklarált változó deklarációja a függvény elejére kerül. Ez azt jelenti, hogy a változót a deklarációja előtt is használhatod, de értéke ekkor undefined lesz.
  • Váratlan viselkedés ciklusokban: for ciklusokban, aszinkron műveletekkel (pl. setTimeout), a var-ral deklarált változó a ciklus utolsó értékét fogja hordozni minden aszinkron callback számára, nem az iteráció pillanatában lévőt.

Példa a felhúzásra és felülírásra:

function peldaVarKozossege() {
  console.log(a); // undefined (a hoisting miatt)
  var a = 10;
  if (true) {
    var a = 20; // Felülírja a külső 'a' változót
    console.log(a); // 20
  }
  console.log(a); // 20 (az if blokk értéke)
}

peldaVarKozossege();

Példa ciklussal és aszinkron műveletekkel:

function peldaCiklusVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // 3, 3, 3 fog kiíródni (i a ciklus utolsó értéke)
    }, 100);
  }
}

peldaCiklusVar();

Ezek miatt a tulajdonságok miatt ajánlott let vagy const használata, amelyek blokk szintű hatókörrel rendelkeznek, a váratlan helyzetek elkerülése érdekében.