Funkcje i parametry

Znamy ze szkoły funkcje takie jak prosta parabola: f(x)=x*x. W językach programowania rozróżnia się definicję i stosowanie funkcji. Jak już pokazano we wcześniejszych przykładach, definicja funkcji rozpoczyna się od słowa function, po którym może wystąpić nazwa, parametry i blok kodu.

Użycie (wywołanie) funkcji polega na podaniu jej nazwy i parametrów. W tym przypadku:

> function f(x) { return x*x; }
> f(12);
144
> a=11;
11
> f(a)
121
> b=f(2);
4
> f(b);
16

Słowo return oznacza wynik jaki funkcja zwraca. Wynik ten może być użyty w dalszych działaniach. Na przykład wstawiony do zmiennej – jak w wierszu b=f(2).

Warto też zwrócić uwagę na to, że wartości zmiennych (a,b) przekazane do funkcji są dostępne wewnątrz funkcji pod nazwą x (czyli nazwą parametru).

Parametrów może być więcej niż jeden. Rozdzielamy je wówczas przecinkami.

Funkcje w językach programowania tylko w pewnym stopniu działają tak, jak w matematyce. Najistotniejszą różnicą jest to, że we wnętrzu funkcji możemy sięgać do wartości z otoczenia w którym funkcja została umieszczona (nie zawsze więc dla tych samych wartości parametrów uzyskamy taki sam wynik).

Przykład:

> var przesuniecie = 0;
> function f(x) { return x*x+przesuniecie; }
> f(3);
9
> przesuniecie=10;
> f(3);
19

Taki sposób programowania nie jest zalecany, gdyż prowadzi do pomyłek. Lepiej przekazać wszystkie używane wartości w postaci parametrów:

> function f(x,przesuniecie) { return x*x+przesuniecie; }
> f(3,10);
19
> f(3,5);
14

Zakres widoczności identyfikatorów

Jednym z problemów jakie są związane z dostępem do środowiska poza funkcją są tak zwane domknięcia (closures). Zasadniczo chodzi o to, że zmienna jest widoczna w bloku funkcji w której ją zdefiniowano. Definiując nową zmienną o takiej samej nazwie – przykrywamy poprzednią, ale tylko w obrębie funkcji w której dokonano “przykrycia”.

Przykład:

> var przesuniecie=1;
function f(x) { var przesuniecie=11; return x*x+przesuniecie; }
> f(3)
20
> przesuniecie=10;
10
> f(3)
20
> przesuniecie;
10
>

UWAGA! Zadeklarowana słowem var zmienna jest widoczna w całej funkcji - także w instrukcjach poprzedzających wspomianą deklarację.

W najnowszej wersji standardu Javascript (ES6) wproadzono alternatywne mechanizmy deklarowania zmiennych. Zamiast słowa var można użyć let(lokalna definicja zmiennej) lub const (lokalna definicja zmiennej, która nie zmienia swej wartości). Lokalna – czyli taka, która jest widoczna wyłącznie w bloku w jakim ją definiowano (nie musi to być blok funkcji).

Przykład:

> if (true) { var x=1; }
> x
1
> if (true) { let y=1; }
> y
ReferenceError: y is not defined
> if (true) { const z=1; }
> z
ReferenceError: z is not defined

Skutki uboczne

Wiemy już, że zmienne przechowują referencje do obiektów, a nie tylko obiekty. Dotyczy to także parametrów. Dzięki temu skutki działania funkcji mogą wykraczać poza zwracanie wyniku poprzez return.

Przykład:

var obiekt2={};
var liczba2=1;
> function test_ref(o,l) {
 o.wlasnosc='zmiana';
 l=999;
}
> test_ref(obiekt2,liczba2);
> obiekt2;
{ wlasnosc: 'zmiana' }
> liczba2;
1

UWAGA! Jeśli zadeklarujemy obiekt2 jako cons (zamiast var) – efekt będzie taki sam. Użycie const mówi o tym, że niezmienna jest referencja do obiektu. Jego wnętrze może ulegać zmianie.