Zasięg zmiennych |
Wpisany przez Patryk yarpo Jar | |||
wtorek, 25 maja 2010 19:18 | |||
Javascript jak każdy znany mi język programowania posiada zmienne. Posiada także zasięg zmiennych. Jednak dla programistów przyzwyczajonych do C (Javy, C++, C#) zasada działania zasięgu zmiennych może okazać się mylna...
Prosty kod
Powyższy kod wyświetli:
Póki co żadnych niespodzianek. Czego jednak spodziewasz się w takim wypadku:
Wynik?
O ile 3 alert nie powinien nikogo dziwić, to drugi jest niespodzianką. W JavieScript klamry w pętlach nie tworzą zasięgu. Raz stworzona zmienna jest widoczna do końca funkcji [jeśli jest stworzna poza funkcją, to jest zmienną globalną).
DylemantCo jednak, kiedy chcesz stworzyć zasięg? Czy na pewno nie ma jakiegoś wytrychu? Skoro zadaje to pytanie, to z pewnością odpowiedź brzmi "tak". W C starczyło stworzyć nowy blok kodu objęty klamrami... A w JS?
Tworzenie "bloku" koduStarczy stworzyć anonimową funkcję w funkcji. Funkcja tworzy nowy zasięg. Można ją od razu wywołać. Nie jestem pewien, czy nie zwalnia to skryptu (pewnie tak), jest jednak często sposobem na wredny zasięg zmiennych:)
Działanie takiego kodu będzie mniejszą niespodzianką dla programistów z doświedczeniem w językach dziedziczących po C. Jednak powyższe zastosowanie uważam za niepotrzebne (w końcu po co 90% kodu funckji ma być inną funkcją? Nie lepiej dać po prostu inną nazwę zmiennej?)
Rozsądne zastosowanieCzęsto jest tak, że mamy kod HTML z fragmentem JS:
Taki kod pozwala nam poczuć się choćby trochę bezpieczniej. Gdy załączasz wiele plików JS z różnych źródeł, w końcu nastąpi konflikt nazw. Warto zatem zabezpieczyć się choćby w ten sposób (lepiej jest użyć przestrzeni nazw, ale o tym kiedy indziej). Do naszego skryptu przekazujemy tylko te zmienne, które uważamy za niezbędne. Pozostałe też - jako zmienne globalne będą w anonimowej funkcji widoczne. Jeśli jednak każdą deklarację zmiennej poprzedzisz słowem kluczowym 'var' to twoje zmienne nie nadpiszą wartości globalnych.
To rozwiązanie często wykorzystywane jest w takim celu:
Wiele skryptów tworzy obiekty wykorzystując właśnie nazwę $. Dlatego twórcy jQuery zdecydowali się na trzymanie referencji do frameworka w zmiennej o nazwie 'jQuery'. Wewnątrz naszej anonimowej funkcji pod zmienną o nazwie $ na pewno zawsze będziemy mieli jQuery. Warto, różne rzeczy w JS są możliwe :) Zarówno dobre, jak i złe :)
|