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:

 nazwa=function(argument) {};

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ą.

 globalna=function() { return "to jest globalna funkcja" }
 alert(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.

  opcjonalny=function(argument1, argument2)
  {
    if (argument2) 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.

  dowolne=function(){
    for (var i in arguments)
      alert('Argument: '+(i+1)+', wartość: '+ 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.

 dodaj=function(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.

  f1=function(a,b) {
    alert(a+b);
  }
f2=function(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 klasdziedziczenia oraz parametryzacji algorytmów (np. Array.sort(funkcja) jako parametr przyjmuje funkcję umożliwiając sortowanie wg własnych kryteriów).

 wykonaj=function(funkcja_do_wykonania)
 {
   funkcja_do_wykonania();
 }
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;
 test=function() 
 {
   var x = 1;
   return function(){alert(x++);}
 }
 var licznik = test();
 licznik();
 licznik();
 alert(x);

Powyższy kod działa następująco:

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: 29.08.2011, 09:38
submit