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ź