Funkcje w JavaScript
Funkcje są najpotężniejszym elementem JavaScript. Mogą pełnić rolę funkcji w języku C, metod oraz konstruktorów w C++/Java, a także klas wewnętrznych Javy lub funkcji lambda.
Funkcje w JS są „obywatelem pierwszej kategorii” (ang. first class objects) — mogą być tworzone w każdej chwili, przypisywane do obiektów, a nawet przekazywane jako argument do innych funkcji.
Definiowanie funkcji
Są dwa sposoby, które używa się naprzemiennie. Zapis
function nazwa(argument){}
jest równoważny z:
var nazwa = function(argument) {};
global scope po polsku? To chyba nie jest kod globalny. scope tłumaczy się (chyba) na zasięg, ale zasięg globalny brzmi dziwnie...
a może przestrzeń globalna ? to brzmi lepiej
w podręcznikach programowania (np. opisujących język C++) powszechnie używa się właśnie terminu „zasięg globalny”
Tworzenie funkcji ma różny efekt zależnie od kontekstu. W zasięgu globalnym funkcja zostanie stworzona jako nowe pole obiektu window, czyli zostanie ogólnie dostępną funkcją globalną.
function globalna() { return "to jest globalna funkcja" }alert(window.globalna);Alert nie wykona funkcji, tylko wyświetli kod, który ona zawiera. Pominięcie()daje dostęp do całej funkcji zamiast tylko jej wyniku.
Funkcje mają inne znaczenie przy tworzeniu klas i inaczej deklaruje się je przy obsłudze zdarzeń.
Argumenty funkcji
Funkcje mogą mieć dowolną, zmienną ilość argumentów. Nadmiarowe argumenty są ignorowane, a za brakujące podstawiana jest wartość undefined.
function opcjonalny(argument1, argument2){if (argument2 != undefined) alert("podano drugi argument")}opcjonalny("pierwszy")opcjonalny("pierwszy", "drugi")opcjonalny("pierwszy", "drugi", "zignorowany")
Funkcje z ruchomą liczbą argumentów
Zmienna lokalna arguments jest (pseudo)tablicą zawierającą wszystkie argumenty przekazane do funkcji.
function dowolne(){for(var i = 0; arguments.length; ++i)alert('Argument: '+(i+1)+', wartość: '+ bez.arguments[i]);}dowolne("pierwszy", "drugi", "trzeci")
arguments.callee zawiera referencję do wywołanej funkcji. Umożliwia to funkcjom anonimowym rekurencyjne wywołanie samych siebie.
Zwracana wartość
Jeżeli w ciele funkcji zostanie napotkane słowo kluczowe return, to funkcja kończy swoje wywołanie i zwraca wartość następującą po słowie return (zarówno typ prosty jak
i obiekt). Jeżeli po słowie return nie ma podanej wartości lub w ciele funkcji nie występuje takie słowo w ogóle, to funkcja zwraca obiekt undefined.
function dodaj(skladnik1, skladnik2){return skladnik1+skladnik2;/* jakikolwiek kod tutaj nie zostanie już wykonany */}var cztery = dodaj(2,2);
Funkcje jako obiekt
JavaScript dopuszcza rzecz niespotykaną w innych językach — traktowanie funkcji jak obiekt. Można je przekazywać, przypisywać zmiennym, przypisywać do pól obiektów i robić z nimi wszystko to, co z każdym innym obiektem w JavaScript.
function f1(a,b) {alert(a+b);}
function f2(a,b) {alert(a-b);}
var g = f1;
g(7,3); /* wyświetla "10" */
g = f2;
g(7,3); /* wyświetla "4" */
Wykorzystuje się tę cechę do implementacji klas i dziedziczenia oraz
parametryzacji algorytmów (np. Array.sort(funkcja) jako parametr przyjmuje funkcję umożliwiając sortowanie wg własnych kryteriów).
function wykonaj(funkcjaDoWykonania){funkcjaDoWykonania();}
var funkcja = function(){alert("Hello world");};wykonaj(funkcja);
Zasięg zmiennych funkcji
Zmienne mogą mieć zasięg globalny lub lokalny. Zależy to od miejsca deklaracji. Jeżeli zmienna została zadeklarowana (var nazwa_zmiennej;) poza funkcją, to posiada zasięg globalny.
Zmienna zadeklarowana w funkcji posiada zasięg lokalny, czyli nie jest dostępna poza funkcją.
var x = 7;function test(){var x = 1;return function(){x++;alert(x);}}var licznik = test()licznik();licznik();alert(x)
Powyższy kod działa następująco:
- tworzy zmienną x równą 7
- tworzy funkcję
test() - w funkcji
test()tworzy nową zmienną x - tworzy i zwraca anonimową funkcję
- która następnie jest zapamiętywana w zmiennej licznik
- i wywołana dwukrotnie
-
alert()poda wartość zmiennej x zdefiniowanej na początku
Efekt będzie taki, że kod poda najpierw liczby 2, 3, a potem 7. Stanie się tak dlatego, że funkcja licznik(), która powstała wewnątrz funkcji test(), będzie cały czas
odwoływała się do x wewnątrz test(), zamiast do „globalnego” x na zewnątrz funkcji. Natomiast alert(x) poza funkcją
test() nie „widzi” jej wewnętrznej zmiennej i użyje tej zadeklarowanej na zewnątrz.
Zmodyfikowano: 30.01.2010, 18:42