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.