mk-prg-net \ js \ basics \functional

Bedeutung der Funktionen

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.
Koordinatentrafo polar in kartesisch
[0,0]

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

  1. klassische Funktionsblöcke mit Parameterliste wie function PrimScan(von, bis){ ... }
  2. Durch Zuweisung annonymer Funktionsblöcke an Funktionsobjektvariablen var f = function(x) {return Math.sin(x); }
  3. 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 !

Bsp.: Funktionsplotter
Zu plottendes Intervall [a,b]

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:

{{result}}

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) .
_ lodash Lib
Funktionale Programmierung mittels der lodash