Funktionen sind in der gegenwärtigen JavaScript eines der bedeutensten Instrumente für die Implementierung.
So wird elementares Laufzeitverhalten wie Blockscope, Objektmethoden und komplexe Bibliotheken wie
jQuery oder D3
durch bzw. als Funktionen realisiert.
Beispielfunktion PolarToCartesian
Implementierung der Umrechung aus gemessenem Abstand und Winkel eines Flugobjekts mit einem
Flughafenradar in Entfernung und Flughöhe.
Funktionen als Objekte
In JavaScript sind Funktionen echte Objekte. Sie besitzen Eigenschaften und Methoden.
Auch können sie wie Objekte an Variablen zugewiesen,
als Parameter an Funktionen übergeben oder von diesen als Rückgabewerte zurückgegeben werden.
Man kann sich den Aufruf einer
Funktion in JS wie das Erzeugen eines Objektes vorstellen, dessen innerer Zustand die Parameter beim Aufruf und die verwendeten lokalen Variablen
bei der Ausführung der Funktion sind.
Erstellen von Funktionen
Funktionen können in JavaScript erstellt werden durch
klassische Funktionsblöcke mit Parameterliste wie function PrimScan(von, bis){ ... }
Durch Zuweisung annonymer Funktionsblöcke an Funktionsobjektvariablen var f = function(x) {return Math.sin(x); }
Ab ES6 durch Arrow- Funktionen x => Math.sin(x)
Dynamisch Funktionen erstellen
Die JavaScript Funktion eval("...") interpretiert Strings zur Laufzeit als JavaScript- Code. Ein JavaScript- Programm kann so zur Laufzeit
in JavaScript programmiert werden. Hört sich ein wenig abenteuerlich an, und ist es auch !
Das Beispiel Plotter ist aus sicherheitstechnischer Sicht problematisch, da beliebiger JS Code in der Eingebazeile als
Term übergeben werden kann, der der nicht nur gutes, sondern auch böses tun kann ! So ist z.B. der global Scope mit dem
all seinen Objekten dem User schutzlos ausgeliefert ! Geben sie als Term z.B. ein
$("article").attr("style", "background-color: red"), dann färbt sich der Hintergrund des aktuellen Artikels rot,
anstatt eine Funktion zu plotten. Genauso könnte bequem mittels dem globalen jQuery- Objekt eine Web- API aufgerufen werden.
Ein weiteres Problem entsteht dadurch, dass der in eval dynamisch erzeugte und ausgeführte Code eine unnötig großen
Scope hat: so hat in folgendem Programm der Code in eval auch den lokale Scope von f im Zugriff:
var X = 'glob';
function f(){
var X = 'loc';
// dierekter Aufruf von eval
return eval('alert(X)');
}
f(); // Ausgabe 'loc' !!
eval- Sandbox
Um den dynamisch erzeugten Code mittels eval- Funktion den Zugriff auf die globalen Objekte zu verwehren,
kann aber gerade die Erwiterung von eval auf den global Scope ausgenutzt werden: Im global Scope der Funktion
evalSandbox werden die zu schützenden globalen Objekte als lokale Variablen redefiniert:
function EvalSandbox(txt) {
"use strict";
var window = null;
var document = null;
var $ = null;
try {
return eval(txt);
} catch (err) {
alert("save eval fails while: " + err.message);
}
}
Parameterübergabe
Die Parameterlisten in JavaScript sind immer dynamisch und werden durch ein Spezialarray
namens arguments implementiert.
Variadische Funktionen
Variadische Funktionen können belibig viele Parameter verarbeiten. Hier im Beispiel wird der Durchschnitt
aus n Werten berechnet:
Optionale Parameter und Konfigurationsobjekte
Aufrufkontext und this
Verweis auf den Kontext mittels this.
Funktionen mit call explizit an Empfänger/Kontext binden (call.js).
Linkspartielles binden
Linkspartielles binden von Funktionen mittels bind (bind_curring.js).
Arrow- Funktionen
Closures
Details zu Closures hier.
Closures
Scope von Funktionen mittels Closures erweitern (closures.js).
Höhere Funktionen und funktionale Programmierung
Die Menge der Abbildungsvorschriften (Funktionen) und der auf ihnen existierenden Operatoren wie Komposition,
Rekursion und partieller Parameterbindung sind in JavaScript implementiert und bilden damit den Kern der
funktionalen Programmierung.
Funktionale Listenverarbeitung mittels forEach, map, filter, concat etc. (ArrayLisp.js) .