Podstawy Node.js

Funkcje

W języku JavaScript funkcje można tworzyć za pomocą instrukcji rozpoczynających się od słowa function:

function harmonicMean(x, y) {
  return 2 / (1/x + 1/y);
}

Taka instrukcja zawiera:

  • nazwę funkcji; w powyższym przykładzie: harmonicMean;
  • listę argumentów wejściowych funkcji, zawartych w nawiasach okrągłych i oddzielonych przecinkami; w powyższym przykładzie: (x, y);
  • instrukcje, które mają być wykonywane po wywołaniu funkcji, zapisane wewnątrz nawiasów klamrowych { }.

Wynik wyrażenia poprzedzonego słowem return będzie wartością zwracaną przez funkcję.


Wyrażenia funkcyjne

Funkcje można również tworzyć za pomocą wyrażeń funkcyjnych (ang. function expressions):

const harmonicMean = function(x, y) {
  return 2 / (1/x + 1/y);
}

W powyższym przykładzie, wyrażenie po prawej stronie znaku = jest wyrażeniem funkcyjnym. Wynik tego wyrażenia – funkcja wyznaczająca średnią harmoniczną – jest zapisywany do stałej o nazwie harmonicMean.

Funkcja stanowiąca wynik wyrażenia funkcyjnego sama w sobie nie ma nazwy – jest tzw. funkcją anonimową (ang. anonymous function). W powyższym przykładzie nazwę ma natomiast zmienna harmonicMean, do której zapisywany jest wynik wyrażenia funkcyjnego.


Notacja ze strzałką

Funkcje anonimowe można definiować za pomocą tzw. strzałkowych wyrażeń funkcyjnych (ang. arrow function expressions). W porównaniu ze zwykłymi wyrażeniami funkcyjnymi, wyrażenia strzałkowe:

  • są krótsze, m.in. nie zawierają słowa function;
  • mają jednak pewne ograniczenia (por. MDN Web Docs).

Strzałkowe wyrażenia funkcyjne mają zwykle następującą postać:

([lista_argumentów]) => [zwracane_wyrażenie]

albo:

([lista_argumentów]) => {
  [jedna_lub_więcej_instrukcji]
}

Lista argumentów może być pusta, może zawierać jeden argument, albo może zawierać kilka argumentów, oddzielonych przecinkami:

() => [zwracane_wyrażenie]

(arg1) => [zwracane_wyrażenie]

(arg1, arg2, arg3) => [zwracane_wyrażenie]

W przypadku braku nawiasów klamrowych, wyrażenie znajdujące się po prawej stronie symbolu => jest tym, co w „klasycznej” definicji funkcji byłoby poprzedzone słowem return.

Przykładowo, funkcję służącą do obliczania średniej harmonicznej można byłoby zrealizować w następujący sposób:

const harmonicMean = (x, y) => 2 / (1/x + 1/y);

Istotne jest to, że strzałka jest „podwójna”, tzn. =>, a nie ->.


Przekazywanie funkcji

W języku JavaScript funkcje można przekazywać jako argumenty wejściowe do innych funkcji. Poniższy przykład przedstawia funkcję służącą do wyznaczania przybliżonej wartości pierwszej pochodnej zadanej funkcji matematycznej. Jako argumenty wejściowe przyjmuje ona: 

  • inną funkcję – tę, którą chcemy zróżniczkować;
  • punkt, w którym chcemy wyznaczyć wartość pochodnej.
function gradient(f, x) {
  dx = 0.01;
  return (f(x + dx) - f(x - dx)) / (2 * dx);
}

Przybliżoną wartość pochodnej funkcji f(x) = 2x² + 3 w punkcie x = 1 można wówczas policzyć i wyświetlić w następujący sposób:

function myFunction(x) {
  return 2*x*x + 3;
}

console.log(gradient(myFunction, 1));
4.0000000000000036

Funkcję, której pochodną chcemy policzyć, można byłoby też przekazać do funkcji gradient w postaci anonimowej, korzystając z wyrażenia funkcyjnego:

var z = gradient( (x) => 2*x*x + 3, 1);
console.log(z);
4.0000000000000036

Literatura