Start · Sprachen · JavaScript · Referenz · new Function()

new Function()

Methode

Der <code>Function()</code>-Konstruktor erzeugt zur Laufzeit ein neues Function-Objekt aus Strings für Parameternamen und Funktionsrumpf.

seit JavaScript ES1 (Baseline: alle Browser, Node.js) Kategorie: method-property

Signatur

new Function(arg1, arg2, /* …, */ argN, functionBody)

Beschreibung

Der Function()-Konstruktor erzeugt eine Funktion zur Laufzeit. Die Parameternamen und der Funktionsrumpf werden als Strings übergeben und erst beim Aufruf des Konstruktors geparst. Das ist nützlich, wenn Code wirklich dynamisch entsteht, etwa bei Template-Engines, Formel-Auswertern oder Code-Generatoren. Den Konstruktor kann man mit oder ohne new aufrufen, das Ergebnis ist in beiden Fällen gleich.

Anders als bei eval() läuft eine mit new Function() erzeugte Funktion immer im globalen Gültigkeitsbereich. Sie bildet also keinen Closure über die lokalen Variablen der Stelle, an der sie erzeugt wird. Sie sieht nur ihre eigenen Parameter, eigene lokale Variablen und globale Variablen. Deshalb ist sie besser vorhersehbar als eval() und lässt sich besser optimieren, eine echte Sandbox ist sie aber nicht.

Die erzeugten Funktionen laufen im nicht-strikten Modus (Sloppy Mode), außer der Rumpf beginnt selbst mit "use strict". Sie heißen immer anonymous, was man an fn.name und fn.toString() sieht. Für asynchrone Funktionen und Generatoren gibt es die entsprechenden Konstruktoren AsyncFunction, GeneratorFunction und AsyncGeneratorFunction. Sie sind nicht global verfügbar, man kommt über den Prototyp an sie heran, zum Beispiel mit (async () => {}).constructor.

Im normalen Anwendungscode braucht man new Function() fast nie. Funktionsausdrücke, Pfeilfunktionen und Funktionsdeklarationen sind schneller, sicherer, werden von Werkzeugen wie Linter und Bundler erfasst und sind leichter zu debuggen.

Parameter

Name Typ Default Beschreibung
$arg1, …, argN string Namen der formalen Parameter als Strings. Mehrere Namen dürfen auch in einem kommagetrennten String stehen ("a, b"). Standardwerte ("x = 1") und Rest-Parameter ("...args") sind ebenfalls erlaubt.
$functionBody string "" Der Funktionsrumpf als String mit JavaScript-Anweisungen. Es ist immer das letzte Argument. Fehlt es, entsteht eine leere Funktion.

Rückgabewert

Typ
Function
Beschreibung
Ein neues Function-Objekt mit dem Namen anonymous, das im globalen Gültigkeitsbereich ausgeführt wird.

Beispiele

Einfache Funktion aus Strings erzeugen

const add = new Function('a', 'b', 'return a + b;');

console.log(add(2, 3));
console.log(add.name);
console.log(add.toString());
5 anonymous function anonymous(a,b ) { return a + b; }

Kein Zugriff auf lokale Variablen (globaler Gültigkeitsbereich)

globalThis.faktor = 10;

const erzeuge = () => {
  const faktor = 2; // lokal, für die neue Funktion unsichtbar
  const mitFunction = new Function('x', 'return x * faktor;');
  const mitClosure = (x) => x * faktor;
  return [mitFunction(5), mitClosure(5)];
};

console.log(erzeuge());
[ 50, 10 ]

Einfacher Formel-Auswerter mit festen Variablen

// Formel aus einer (vertrauenswürdigen!) Konfiguration
const formel = 'netto * (1 + steuer)';

// Nur ausgewählte Namen werden als Parameter übergeben
const berechne = new Function('netto', 'steuer', `"use strict"; return (${formel});`);

console.log(berechne(100, 0.19).toFixed(2));
119.00

Asynchrone Funktion dynamisch erzeugen

const AsyncFunction = (async () => {}).constructor;

const ladeVerzoegert = new AsyncFunction(
  'ms', 'wert',
  'await new Promise((r) => setTimeout(r, ms)); return wert;'
);

const ergebnis = await ladeVerzoegert(100, 'fertig');
console.log(ergebnis);
fertig

// Wichtig · Fallstricke

Sicherheit: new Function() führt beliebigen Code aus, genau wie eval(). Wenn Benutzereingaben, URL-Parameter oder Daten von fremden Servern in die Strings gelangen, ist das eine klassische Lücke für Code-Injection bzw. XSS. Übergib niemals Daten, denen du nicht vertraust. Der globale Gültigkeitsbereich ist keine Sandbox, denn die Funktion kann auf window, document, Cookies und fetch zugreifen.

Content Security Policy: Wenn eine CSP ohne 'unsafe-eval' in script-src gilt, wirft new Function() einen EvalError. Das betrifft viele Browser-Erweiterungen (Manifest V3) und abgesicherte Webanwendungen. Auch Trusted Types können den Aufruf blockieren.

  • Syntaxfehler im Rumpf fallen beim Erzeugen auf, nicht erst beim Aufruf. Dann wird ein SyntaxError geworfen.
  • Leistung: Jeder Aufruf des Konstruktors parst den Code neu. Erzeuge die Funktion daher einmal, speichere sie zwischen und rufe sie danach mehrfach auf. Erzeuge sie nicht in Schleifen.
  • Die Funktionen laufen im Sloppy Mode, außer der Rumpf beginnt mit "use strict". Dort ist this bei einem normalen Aufruf das globale Objekt.
  • Minifier benennen lokale Variablen um. Code in Strings, der auf solche Namen verweist, geht dadurch kaputt.
  • In Node.js kannst du für abgeschottete Ausführung das Modul vm verwenden. Auch das ist aber keine Sicherheitsgrenze für nicht vertrauenswürdigen Code.