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ź