2012-06-12 11:02:25

Jaki jest zasięg zmiennych w JavaScript

Zasięg zmiennych w JavaScript może dla niektórych okazać się zaskakujący. Wystarczy jednak uruchomić poniższy kod, by wszystko stało się jasne.

<html>
<script type="text/javascript">
var a=1;
var b=2;
var c=3;
 
zasieg(a);
 
function zasieg(a)
{
	var b;
	a++;
	b++;
	c++;
	alert(a+' '+b+' '+c);
}
 
alert(a+' '+b+' '+c);
</script>
</html>

Każda z wymienionych trzech zmiennych zachowuje się inaczej. Zmienna a z początkową wartością 1 jest przekazana do funkcji zasieg() jako argument. W związku z tym wewnątrz funkcji jest zmienną lokalną. Inkrementacja tej zmiennej wewnątrz funkcji nie wpływa na wartość zmiennej a poza funkcją. Pierwsza instrukcja alert(a+’ ‘+b+’ ‘+c) wyświetli wartość 2 dla zmiennej a, natomiast druga - wartość 1.

Zmienna b jest ponownie tworzona wewnątrz funkcji, wobec czego jest to całkowicie nowa zmienna i nie posiada wartości, a więc nie podlega również inkrementacji. Instrukcja alert(a+’ ‘+b+’ ‘+c) wewnątrz funkcji wyświetli dla zmiennej b NaN (not a number – wartość nie numeryczna). Natomiast poza funkcją wartością zmiennej b będzie niezmiennie 2.

Zmienna c nie jest ani przekazywana do funkcji zasieg() jako argument, ani nie jest tworzona wewnątrz tej funkcji. Wartością początkową zmiennej c jest 3. Wewnątrz funkcji zasieg() ta zmienna jest nadal dostępna. W języku JavaScript zmienne, które nie są przekazane do funkcji jako argumenty, ani nie były utworzone wewnątrz funkcji słowem var, a istniały poza funkcją, automatycznie stają się wewnątrz funkcji zmiennymi globalnymi. Zmiany wartości zmiennej c, które zajdą wewnątrz funkcji, będą też widoczne poza tą funkcją. Obydwie instrukcje alert(a+’ ‘+b+’ ‘+c) wyświetlą tę samą wartość zmiennej c.

Tagi: , , ,

2 odpowiedzi do “Jaki jest zasięg zmiennych w JavaScript”

  1. procek pisze:

    Z tego co mi wiadomo w PHP teraz (chyba od 5.3) też mamy już domyślne przekazywanie przez referencję. Czy tak faktycznie jest?

  2. !Leszek Sewastianowicz pisze:

    W PHP domyślne przekazywanie przez referencje dotyczy tylko obiektów i jest tak od wersji wcześniejszej niż 5.3, ale nie pamiętam dokładnie od której. Drugą różnicą bardziej widoczną jest dostęp do wszystkich zmiennych spoza funkcji jako do zmiennych globalnych.

Dodaj odpowiedź

Musisz się zalogować aby dodać komentarz.