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: JavaScript, zasięg zmiennych, zmienne globalne, zmienne lokalne
Z tego co mi wiadomo w PHP teraz (chyba od 5.3) też mamy już domyślne przekazywanie przez referencję. Czy tak faktycznie jest?
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.