In der imperativen Programmierung sind Funktionen ein wichtiges Mittel zur Modularisierung. Oft benötigter Code kann in Funktionen zusammengefasst werden und über den Namen der Funktion nach Bedarf aufgerufen werden.
Funktionen können einen oder mehrere Aufrufparameter haben und liefern nach ihrem Ende i.d.R. einen Funktionswert zurück.
In JavaScript gibt es bereits einige implementierte Funktionen.
So z.B. parseInt(Zahl), parseFloat(Zahl) oder die mächtige Funktion eval(Term), die den numerischen Wert des übergebenen Termes (Rechenausdruck) zurückgibt.
Weitere objektunabhängige Funktionen findet man hier.
Wir wollen uns anschauen, wie man eine benutzerdefinierte Funktion erstellt.
Deklaration
Bevor man eine Funktion verwenden, sprich: aufrufen kann, muss man sie deklarieren (bekannt machen, implementieren).
Für den Funktionsname gelten die gleichen Regeln, wie für Variablen
p1, p2, ... nennt man Parameter. Sie übernehmen die Werte, mit denen die Funktion später aufgerufen werden kann.
Alle Parameter und evtl. Variablen, die innerhalb einer Funktion deklariert werden, sind nur innerhalb der Funktion gültig.
Man nennt sie deshalb auch lokale Variablen.
Funktionen ohne Rückgabewert, also ohne return-Anweisung heißen Prozeduren.
Beispiel:
functionmonatszins (K, p)
{ jahreszins = K * p / 100; returnjahreszins / 12;
}
Erklärung:
Die Funktion monatszins bekommt bei einem Aufruf einen Wert für K und einen Wert für p als Parameter übergeben.
Die Funktion berechnet die Zinsen für einen Monat und gibt diesen Wert der aufrufenden Stelle zurück.
Aufruf
Der Vorteil von Funktionen ist, dass man sie einerseits an beliebiger Stelle im Programm, d.h. im JavaScript-Bereich verwenden kann.
Andererseits kann innerhalb erlaubter HTML-Tags wie z.B. <body...>, <a href...> oder in einem Formular-Tag wie <input...> eine selbst definierte Funktion dann mit Hilfe eines Event-Handlers aufgerufen werden. Dazu später mehr.
Beispiel:
var kapital, zinssatz; kapital = prompt("Bitte geben Sie das Kapital ein! "); zinssatz = prompt("Bitte geben Sie den Zinssatz ein! ");
document.write("Der monatliche Zins beträgt " + monatszins(kapital, zinssatz));
Erklärung:
Kapital und Zinssatz können eingegeben werden.
Während der Ausgabe durch die Methode document.write wird die Funktion monatszins mit den Werten von kapital und zinssatz aufgerufen.
Diese oben deklarierte Funktion monatszinssatz gibt dem Ausgabestream den von der Funktion berechneten Wert zurück, der dann mit dem Text ausgegeben wird.
Rekursive Funktionen
Rein intuitiv programmiert man immer iterativ. Die Iteration (v. lat. iterare "wiederholen") ist in der Mathematik eine Methode, sich der Lösung eines Rechenproblems schrittweise, aber zielgerichtet anzunähern. Sie besteht in der wiederholten Anwendung desselben Rechenverfahrens.
In der Informatik bedeutet Iteration, wenn ein Zugriff schrittweise, beziehungsweise wiederholt, auf Datenstrukturen erfolgt, beispielsweise bei einer FOR-Schleife.
Als Rekursion (lat. recurrere "zurücklaufen") bezeichnet man die Technik in Mathematik, Logik und Informatik, eine Funktion durch sich selbst zu definieren (rekursive Definition).
Jeder Aufruf der rekursiven Funktion muss sich durch Entfalten der rekursiven Definition in endlich vielen Schritten auflösen lassen. Umgangssprachlich sagt man, sie darf nicht in eine Endlosschleife geraten.
Beispiel:
Die Funktion sum(n) soll zu jeder Zahl n die Summe der ersten n natürlichen Zahlen berechnen. Sie ist iterativ folgendermaßen definiert:
Um eine gleichwertige rekursive Definition der Summenfunktion zu erhalten, bestimmen wir zunächst den einfachen Fall, den Rekursionsanfang.
Im Beispiel handelt es sich um den Funktionswert für 0.
Übrig bleibt der schwierige Fall, also hier der Funktionswert für n > 0. Den schwierigen Fall führen wir auf einen einfacheren Fall zurück, nämlich auf den Fall n - 1.
Dieser einfachere Fall wird unser rekursiver Aufruf. Die entsprechende Vorschrift heißt Rekursionsschritt. Beispielsweise lässt sich die Summe der ersten n Zahlen berechnen, indem man die Summe der ersten n - 1 Zahlen berechnet und dazu die Zahl n addiert:
Diese beiden Gleichungen lassen sich zu einer rekursiven Definition der Summenfunktion zusammenfassen:
Die Summe der Zahlen von 0 bis 3 berechnet sich dann wie folgt:
Die Aufruf-Kette dazu sieht so aus:
Rekursive Funktion:
functionsum(n)
{ if (n == 0) var summe = 0; //Rekursionsanfang elsesumme = sum(n-1) + n; //Rekursionsschritt returnsumme;
}
Iterative Funktion:
functionsum(n)
{
var summe = 0; for (i=1; i<=n; i++) summe = summe + i; returnsumme;
}
Rein mathematische Funktion mit Hilfe der Gaußschen Summenformel: