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í
varv 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í
varje 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 budeundefined. - Nečekané chování v cyklech: V cyklech
fors asynchronními operacemi (napříkladsetTimeout) bude proměnná deklarovaná pomocívarmí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.