JavaScript/Objekte/Function
In JavaScript sind Funktionen keine spezielle Sprachkonstruktion, sondern ganz normale Objekte. Sie haben Eigenschaften und Methoden, sie haben einen Prototypen und es gibt auch eine Konstruktorfunktion, um neue Funktionen zu erzeugen und um das Prototypobjekt bereitzustellen.
Das Function-Objekt stellt die Konstruktorfunktion für alle Funktionen in JavaScript dar. Man kommt nur in Ausnahmefällen in direkten Kontakt damit; normalerweise werden Sie nur die von Function.prototype
bereitgestellten Methoden apply
, call
und bind
benötigen. Um neue Funktionen zu erzeugen, werden Sie normalerweise nicht die Function
-Konstruktorfunktion verwenden. JavaScript stellt dafür einfachere und auch schnellere Alternativen bereit.
Konstruktor
Alle Funktionen, egal wie sie erzeugt wurden, sind Instanzen des Function-Konstruktors und erben daher die Methoden von Function.prototype
. Sie können diesen Konstruktor auch direkt aufrufen, um aus JavaScript-Quellcode eine Funktion zu generieren.
const summe = new Function("a", "b", "return a+b;")
Die Konstruktorfunktion erwartet als Parameter ausschließlich Zeichenketten. Zunächst übergeben Sie die Namen der Parameter, die die Funktion erhalten soll, und als letztes den Quellcode für die Anweisungen, die in der Funktion ausgeführt werden sollen.
Sie können sich die Übergabe der Parameternamen an Function
so vorstellen, dass diese Argumente durch ein Komma verbunden zu einer langen Zeichenkette zusammengesetzt werden. Das Ergebnis wird in die Klammern eingesetzt, die in einer Funktionsdeklaration die Parameter festlegen. Das bedeutet dann aber auch, dass Sie in einem Argument mehrere Parameter für die erzeugte Funktion festlegen können. Das nachfolgende Beispiel erzeugt die gleiche Funktion wie das vorige Beispiel!
const summe = new Function("a,b", "return a+b;")
Es bedeutet auch, dass Sie Defaultwerte für Parameter angeben und sogar Destrukturierungen deklarieren können:
const formel1 = new Function("a, [b1, b2]", "c=9", "return a + b1*b2 + c;");
const formelx = new Function("a, [b1", "b2], c=9", "return a + b1*b2 + c;"); // SO BITTE NICHT
// Äquivalente Definition:
function formel2(a, [b1, b2], c=9) {
return a + b1*b2 + c;
}
console.log(formel1(4, [ 2, 3 ]); // ergibt 4+2*3+9=19
Die Funktion, die an formelx
zugewiesen wird, würde ebenfalls funktionieren. Das Zerreißen des Destrukturierungsparameters [b1, b2]
beeinträchtigt aber die Lesbarkeit und sollte daher unterlassen werden.
Die übergebenen Parameternamen müssen gültige Bezeichner sein.
Parametername
: Der erste, zweite, dritte und alle folgenden Parameter, bis auf den letzten, enthalten die Parameternamen der neuen Funktion – als Strings, oder eine durch Komma getrennte Liste von Bezeichnern (z. B.: "x", "derWert", oder "a,b").Anweisungen
: d. h. den Funktionskörper. Dabei muss es sich ebenfalls um eine Zeichenkette handeln.
Scope
Grundsätzlich gilt, dass eine Funktion in dem Scope ausgeführt wird, in dem die definiert wird. Für Funktionen, die mit new Function()
erzeugt wurden, gilt dies nicht, sie werden immer im globalen Scope ausgeführt.
const a = 3;
function test(a) {
return new Function("x", "return a+x");
}
const func77 = test(77);
console.log(func77(3));
// Ausgabe ist 6, nicht 80