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
varv bloku môže prepísať rovnakú premennú deklarovanú skôr v tej istej funkcii, ale mimo tohto bloku. - Hoisting (zdvihnutie): Deklarácia premennej s
varje zdvihnutá na začiatok funkcie. To znamená, že môžete použiť premennú pred jej deklaráciou, ale jej hodnota v tom momente budeundefined. - Neočakávané správanie v cykloch: V cykloch
fors asynchrónnymi operáciami (napríkladsetTimeout) bude premená svarmať 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í.