[ Pobierz całość w formacie PDF ]
nowej funkcji, która w większej funkcji będzie kilkakrotnie wywolywana.
4.3. Zagnieżdżanie funkcji 117
Kolejną decyzją związaną ze stylem programowania, którą może podejmować autor skryp-
tów, jest miejsce zapisu nawiasów klamrowych. W tej książce zastosowano zasadę, że
otwierający nawias klamrowy zaczyna się w tym samym wierszu, w którym zostala
podana nazwa funkcji; a nawias zamykający jest tak samo wcięty jak deklaracja funkcji.
Niemniej jednak otwierający nawias klamrowy można także zapisywać w wierszu poniżej
nazwy funkcji i ewentualnie wyrównać do początku wiersza:
function mojaFunkcja()
{
// instrukcje
}
Niektórzy programiści uważają, że ten sposób zapisu ulatwia synchronizację par nawiasów
klamrowych. W wypadku funkcji zawierających jedną instrukcję można ją zapisywać
w tym samym wierszu, w którym zostala umieszczona nazwa funkcji:
function mojaFunkcja() { // instrukcja }
Tworząc skrypty, można wykorzystać styl kodowania, który wydaje się nam najbardziej
sensowny.
Patrz także
Receptura 4.1 zawiera informacje o zmiennych przekazywanych przez odwolanie oraz
przez wartość informacje te dotyczą także argumentów funkcji; receptura 4.3 zawiera
informacje na temat zagnieżdżania funkcji.
4.3. Zagnieżdżanie funkcji
NN 4 IE 4
Problem
Chcemy stworzyć funkcję należącą wylącznie do jednej, innej funkcji.
RozwiÄ…zanie
PoczynajÄ…c od przeglÄ…darek ™E 4 oraz NN4, istnieje możliwość zagnieżdżania jednej funk-
cji wewnątrz drugiej, wykorzystując przy tym skladnię przedstawioną na poniższym
przykladzie:
function mojaFunkcjaA() {
// instrukcje
function mojaFunkcjaB() {
// kolejne instrukcje
}
}
118 Rozdział 4. Zmienne, funkcje i sterowanie wykonywaniem skryptów
W tym wypadku funkcja zagnieżdżona może być używana wylącznie w instrukcjach
umieszczonych wewnątrz funkcji zewnętrznej (należy jednak przeczytać informacje do-
tyczące przeglądarki Netscape 6 oraz jej nowszych wersji podane w części Analiza ).
™nstrukcje umieszczone w funkcji zagnieżdżonej majÄ… dostÄ™p zarówno do zmiennych
deklarowanych w funkcji zewnętrznej, jak i do zmiennych globalnych. Z kolei instrukcje
umieszczone w funkcji zewnętrznej nie mają dostępu do zmiennych utworzonych w funk-
cji zagnieżdżonej.
›naliza
Podstawowym celem tworzenia funkcji zagnieżdżonych jest możliwość hermetyzacji czyn-
ności związanych z funkcją zewnętrzną poprzez tworzenie podprogramów prywatnych
dla tej funkcji zewnętrznej. Ponieważ funkcja zagnieżdżona nie jest bezpośrednio dostępna
w przestrzeni globalnej, jej nazwę można wykorzystać zarówno w tej przestrzeni glo-
balnej, jak i wewnÄ…trz dowolnej innej funkcji.
Netscape 6 (oraz nowsze wersje tej przeglądarki) w logiczny i wygodny sposób rozsze-
rzają środowisko funkcji zagnieżdżonych otóż funkcja zagnieżdżona staje się metodą
obiektu funkcji, wewnÄ…trz której zostala zdefiniowana. ™stniejÄ… pewne interesujÄ…ce efekty
uboczne związane ze sposobem implementacji tej możliwości. Przeanalizujmy przyklad
poniższych funkcji testowych:
function mojaFunkcjaA() {
var wartoscA = "A";
mojaFunkcjaB();
function mojaFunkcjaB() {
var wartoscB = "B";
alert(wartoscB);
alert(wartoscA);
}
}
Wywolanie funkcji mojaFunkcjaA() z glównego poziomu skryptu spowoduje, że zosta-
nie wywolana funkcja zagnieżdżona, która poslusznie wyświetli wartości dwóch zmiennych,
z których jedna zostala zdefiniowana w funkcji zewnętrznej, a druga w wewnętrznej.
PrzeglÄ…darka ™nternet Explorer dziala tak samo i zgodnie z naszymi oczekiwaniami. Jednak
w Netscape 6 istnieje możliwość wywolania funkcji zagnieżdżonej z glównego poziomu
skryptu, wykorzystując przy tym funkcję zewnętrzną:
mojaFunkcjaA.mojaFunkcjaB();
Ponieważ w tym wypadku funkcja zewnętrzna nie jest wykonywana, zmienna wartoscA
nie zostaje zainicjalizowana. W momencie wykonania funkcji mojaFunkcjaB() wartość
zmiennej wartoscB jest wyświetlana poprawnie, lecz jest niezdefiniowana (undefined).
Oznacza to, że dostęp do zmiennych zdefiniowanych w funkcji zewnętrznej jest możliwy
wylącznie w tym wypadkach, gdy funkcja zagnieżdżona jest wywolywana przez tę funk-
cję zewnętrzną.
4.4. Tworzenie funkcji anonimowych 119
Patrz także
Receptura 4.1 zawiera informacje o zakresie zmiennych.
4.4. Tworzenie funkcji anonimowych
NN 4 IE 4
Problem
Chcemy zdefiniować funkcję w formie wyrażenia, które można by na przyklad przekazać
jako argument wywolania konstruktora obiektu lub przypisać wybranej metodzie.
RozwiÄ…zanie
W takich wypadkach można skorzystać z alternatywnego sposobu definiowania funkcji,
który nie wiąże się z koniecznością tworzenia funkcji o konkretnych nazwach (przedsta-
wionych w recepturze 4.2). Rozwiązanie to tworzy tak zwane funkcje anonimowe, które
[ Pobierz całość w formacie PDF ]