Funkcje
Co to są funkcje
Funkcje to zbiór zgrupowanych instrukcji, które możemy odpalać poprzez podanie ich nazwy. Każda taka funkcja po wywołaniu wykonuje swój wewnętrzny kod, a następnie może zwrócić nam jakąś wartość.
Ogólna deklaracja funkcji ma postać:
function nazwaFunkcji(nr) {
const result = nr * nr; //możemy też po prostu zwrócić nr * nr
return result;
}
//Po stworzeniu funkcji wystarczy ją wywołać poprzez podanie jej nazwy:
nazwaFunkcji(2); //4
nazwaFunkcji(3); //9
nazwaFunkcji(5); //25Funkcję można traktować jak swego rodzaju podprogramy (autor lubi nazywać je klockami, ale, że niektórym dziwnie to się kojarzy...), które w każdej chwili możemy odpalić by wykonać dany kod. Takie funkcje możesz spokojnie trzymać w oddzielnym pliku, który potem będziesz dołączać do wybranych stron. Na tej właśnie zasadzie używa się znanych bibliotek - np. jQuery, Lodash czy podobnych, które są niczym innym jak zbiorem funkcji, które ktoś dla nas napisał.
W tym kursie już nie raz używałeś funkcji:
alert("Ala ma kota");
Math.random();
Math.max(1,2,3);
"ala ma kota".toUpperCase();
"kot i pies".substr(1);
[1,2,3].push(4);
[1,2,3].join("-");Widzisz te nawiasy na końcu każdej linii? Poprzedza je nazwa danej funkcji. Autorzy JavaScript przygotowali dla nas zestaw funkcji. Miło z ich strony...
Parametry funkcji
Dla każdej funkcji możemy utworzyć parametry. Dzięki nim przy odpalaniu będziemy mogli podawać dla danej funkcji jakieś wartości:
Jeżeli nasza funkcja wymaga pewnych wartości, a my ich nie podamy, zostaną użyte dla nich wartości undefined:
Wartości do funkcji musimy przekazywać w takiej kolejności, jakiej wymaga tego dana funkcja. Możemy to jednak ominąć za pomocą tak zwanej destrukturyzacji.
Domyślne wartości
Jeżeli funkcja wymaga podania wartości przy jej wywołaniu, a my ich nie podamy, w jej wnętrzu będą one wynosić undefined:
Dla parametrów możemy też ustawiać domyślne wartości. Wystarczy po nazwie parametru ustawić mu domyślną wartość:
W poprzednich wersjach JavaScript domyślne atrybuty nie istniały, ale i na to były sposoby.
arguments i rest
JavaScript nie wymaga od nas, abyśmy przekazywali do funkcji wymaganą przez daną funkcję ilość wartości.
Jeżeli nie zakładamy konkretnej liczby parametrów dla funkcji, możemy skorzystać z właściwości arguments, która zawiera w sobie wszystkie przekazane wartości:
Obiekt arguments jest tablico podobny, ale tak naprawdę nie jest tablicą. Oznacza to, że nie możemy na nim wykonywać metod przeznaczonych dla tablic np. reduce, map i podobnych:
W dzisiejszych czasach zamiast operować na obiekcie arguments, zalecane jest używanie rest operator, który zbiera przekazane argumenty w postaci klasycznej tablicy.
Dokładnie na ten temat pomówimy sobie w rozdziale o rest parameter.
Instrukcja return
Każda funkcja zwraca jakąś wartość. Domyślnie jest nią undefined. Aby zwrócić naszą wartość, posłużymy się instrukcją return:
Dzięki temu, że nasza funkcja zwraca jakąś wartość, możemy ją użyć do innych celów niż tylko wypisywanie tekstów w debuggerze:
Instrukcja return nie tylko zwraca wartość, ale i przerywa dalsze działanie danej funkcji.
W wielu edytorach kod leżący za return będzie miał przytłumione kolory, co symbolizuje, że taki kod nigdy sie nie wykona:

Instrukcji return może być wiele dla jednej funkcji. Zawsze jednak wykonana zostanie tylko jedna:
Instrukcja return może zwracać dowolną wartość. Może to być tablica:
...lub obiekt:
lub inne funkcje, o czym przekonasz się nieco później.
Wyrażenie funkcyjne
Do tej pory poznaliśmy jeden sposób tworzenia funkcji:
Jest to tak zwana deklaracja funkcji. Drugi sposób zwie się wyrażeniem funkcyjnym i jest niczym innym jak podstawieniem funkcji pod zmienną:
Wyrażenie i definicja różnią się od siebie nie tylko sposobem zapisu, ale także tym, jak taki kod jest interpretowany przez przeglądarkę.
Funkcja stworzona za pomocą deklaracji jest od razu dostępna dla całego skryptu. Wynika to z działania mechanizmu hoistingu (znany ze zmiennych), który przenosi taką deklarację na początek danego zakresu kodu (skryptu lub funkcji). Dzięki temu możemy odwoływać się do funkcji, która jest zadeklarowana poniżej:
W przypadku wyrażeń funkcyjnych takie odwołanie rzuci nam błędem:
Wynika to z faktu, że powyżej podstawiliśmy funkcję pod zmienną, a przecież do takich nie możemy się odwoływać przed ich utworzeniem.
Istnieje jeszcze jedna różnica między tymi zapisami. Przy stosowaniu deklaracji, dana funkcja zapisywana jest jako klucz obiektu Window (to samo ma miejsce, gdy tworzymy globalną zmienną za pomocą zmiennej var). W przypadku wyrażenia poprzedzonego słowem const/let nie ma to miejsca.

Powyższe różnice nie oznaczają jednak, że deklaracji nigdy nie powinieneś używać. Używaj - a jakże. W większości przypadków takie detale nie mają totalnie znaczenia.
Funkcja anonimowa
Funkcja anonimowa to taka funkcja, która nie ma swojej nazwy. Funkcje takie wykorzystywane są jako funkcje zwrotne, które przekazujemy do innych funkcji.
W dzisiejszych czasach powyższe zapisy możemy skrócić za pomocą tak zwanej funkcji strzałkowej. W kolejnym rozdziale zajmiemy się właśnie nią.
Last updated