Junior
Do jakich konsekwencji może prowadzić deklaracja zmiennej za pomocą var wewnątrz funkcji?
sobes.tech AI
Odpowiedź od AI
Deklaracja zmiennej za pomocą var wewnątrz funkcji ma zakres funkcji. Oznacza to, że taka zmienna jest dostępna w całej funkcji, ignorując zakresy blokowe (np. wewnątrz if lub for).
Skutki:
- Nadpisywanie zmiennych: Zmienna zadeklarowana za pomocą
varw bloku może nadpisać zmienną o tej samej nazwie zadeklarowaną wcześniej w tej samej funkcji, ale poza tym blokiem. - Hoisting: Deklaracja zmiennej za pomocą
varjest podnoszona na początek funkcji. Oznacza to, że można używać zmiennej przed jej deklaracją, ale jej wartość w tym momencie będzieundefined. - Nieprzewidywalne zachowanie w pętlach: W pętlach
forz operacjami asynchronicznymi (np.setTimeout) zmienna zadeklarowana za pomocąvarbędzie miała ostatnią wartość z pętli dla wszystkich asynchronicznych callbacków, a nie wartość w momencie iteracji.
Przykład podnoszenia i nadpisywania:
function przykladScopeVar() {
console.log(a); // undefined (z powodu hoistingu)
var a = 10;
if (true) {
var a = 20; // Nadpisuje zewnętrzną zmienną 'a'
console.log(a); // 20
}
console.log(a); // 20 (wartość z bloku if)
}
przykladScopeVar();
Przykład z pętlą i operacjami asynchronicznymi:
function przykladPętliVar() {
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i); // Wypisze 3, 3, 3 (i ma ostatnią wartość pętli)
}, 100);
}
}
przykladPętliVar();
Ze względu na te cechy, zaleca się używanie let lub const, które mają zakres blokowy, aby unikać nieprzewidzianych sytuacji.