Dlaczego raz jedna zmienna jest widoczna, a drugi raz nie?

0
var boo = 1;
function sayBoo() {
	alert(boo); // 1
}
sayBoo(); 

var foo = 1;

function sayFoo() {
	alert(foo); // undefined
	if (!foo) {
		var foo = 10;
	}
	alert(foo); // 10
}
sayFoo();

Jak to jest, ze po dodaniu if'a nagle alert wypluwa undefined i pozniej 10, zamiast 1?

0

Przyczyną jest var w "var foo = 10;". Po zlikwidowaniu var lub po przeniesieniu "var foo = 10;" przed alert wszystko działa.

0

No okej, ale bardziej mnie interesuje dlaczego?

2

Po dodaniu ifa foo staje się zmienną lokalną na całą funkcję (jako że w JS nie ma block scope, tylko od razu zakres lokalnie na funkcję) i od początku wewnątrz funkcji jest tak postrzegana, lecz jako że jej formalna definicja jest dopiero wewnątrz warunku, przedtem nie ma wartości.

Innymi słowy, masz ekwiwalent w formie kodu:

var foo = 1;
 
function sayFoo() {
    var foo;

    alert(foo); // undefined

    if (!foo) {
        foo = 10;
    }

    alert(foo); // 10
}

sayFoo();
2

Lokalna zmienna zasłania globalną zmienną. W js nie ma znaczenia to, że zmienna lokalna została zadeklarowana w środku funkcji, bo i tak nazwa zmiennej globalnej zostanie zasłonięta. Jednakże, zmienna zostanie zainicjalizowana dopiero w tym miejscu: var foo = 10; Wcześniej jej wartość nie będzie znana.

//niestety spóźniłem się :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1