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 ekkorundefinedlesz. - Váratlan viselkedés ciklusokban:
forciklusokban, aszinkron műveletekkel (pl.setTimeout), avar-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.