Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Warnung: Die Argumente, die an diesen Konstruktor übergeben werden, werden dynamisch geparst und als JavaScript ausgeführt. APIs wie diese sind bekannt als Injection-Punkte und stellen potenziell einen Vektor für Cross-Site-Scripting (XSS) Angriffe dar.
Sie können dieses Risiko mindern, indem Sie stets TrustedScript Objekte anstelle von Strings übergeben und Trusted Types durchsetzen.
Siehe Sicherheitsüberlegungen für mehr Informationen.
Der Function() Konstruktor erstellt Function Objekte. Das direkte Aufrufen des Konstruktors kann Funktionen dynamisch erstellen, leidet jedoch an Sicherheits- und ähnlichen (aber weit weniger signifikanten) Leistungsproblemen wie eval(). Im Gegensatz zu eval (das Zugriff auf den lokalen Kontext haben kann) erstellen Function-Konstruktoren Funktionen, die nur im globalen Kontext ausgeführt werden.
Hinweis: Function() kann mit oder ohne new aufgerufen werden. Beides erstellt eine neue Function Instanz.
TrustedScript Instanzen oder Strings, die die Namen spezifizieren, die von der Funktion als formale Argumentnamen verwendet werden sollen. Der Wert muss einem gültigen JavaScript-Parameter entsprechen (entweder ein einfacher Identifier, Restparameter oder destrukturierter Parameter, wahlweise mit einem Standardwert), oder eine Liste solcher Strings, getrennt durch Kommata.
Da die Parameter auf die gleiche Weise wie Funktionsausdrücke geparst werden, sind Leerzeichen und Kommentare zulässig. Zum Beispiel: "x", "theValue = 42", "[a, b] /* numbers */" — oder "x, theValue = 42, [a, b] /* numbers */". ("x, theValue = 42", "[a, b]" ist auch korrekt, obwohl sehr verwirrend zu lesen.)
functionBodyEin TrustedScript oder ein String, der die JavaScript-Anweisungen enthält, die die Funktionsdefinition umfassen.
Funktionsparameter-Argumente können nicht als gültige Parameterliste geparst werden, oder der functionBody kann nicht als gültige JavaScript-Anweisungen geparst werden.
TypeErrorEin Parameter ist ein String, wenn Trusted Types durch eine CSP erzwungen werden und keine Standardrichtlinie definiert ist.
Function-Objekte, die mit dem Function-Konstruktor erstellt wurden, werden beim Erstellen der Funktion geparst. Dies ist weniger effizient als die Erstellung einer Funktion mit einem Funktionsausdruck oder einer Funktionsdeklaration und deren Aufruf innerhalb Ihres Codes, da solche Funktionen mit dem restlichen Code geparst werden.
Alle an die Funktion übergebenen Argumente, außer dem letzten, werden als Namen der Bezeichner der zu erstellenden Parameter in der Reihenfolge behandelt, in der sie übergeben werden. Die Funktion wird dynamisch als Funktionsausdruck kompiliert, wobei die Quelle wie folgt zusammengestellt wird:
Dies ist beobachtbar durch den Aufruf der toString() Methode der Funktion.
Im Gegensatz zu normalen Funktionsausdrücken wird der Name anonymous jedoch nicht dem functionBody-Scope hinzugefügt, da functionBody nur Zugriff auf den globalen Scope hat. Wenn sich functionBody nicht im strict mode befindet (der Body selbst muss die "use strict" Direktive haben, da er die Striktheit nicht vom Kontext erbt), können Sie arguments.callee verwenden, um auf die Funktion selbst zu verweisen. Alternativ können Sie den rekursiven Teil als innere Funktion definieren:
Beachten Sie, dass die beiden dynamischen Teile der zusammengestellten Quelle — die Parameterliste args.join(",") und functionBody — zuerst separat geparst werden, um sicherzustellen, dass sie jeweils syntaktisch korrekt sind. Dies verhindert versuchsweise Injection-Versuche.
Die Methode kann verwendet werden, um beliebige Eingaben auszuführen, die an einen Parameter übergeben werden. Wenn die Eingabe ein potenziell unsicherer String ist, der von einem Benutzer bereitgestellt wurde, ist dies ein potenzieller Vektor für Cross-Site-Scripting (XSS) Angriffe. Zum Beispiel geht das folgende Beispiel davon aus, dass der untrustedCode von einem Nutzer bereitgestellt wurde:
Websites mit einer Content Security Policy (CSP), die script-src oder default-src spezifiziert, werden das Ausführen solchen Codes standardmäßig verhindern. Wenn Sie die Ausführung von Skripten über Function() zulassen müssen, können Sie diese Probleme mindern, indem Sie stets TrustedScript Objekte anstelle von Strings zuweisen, und Trusted Types durchsetzen unter Verwendung der require-trusted-types-for CSP-Direktive. Dies stellt sicher, dass die Eingabe durch eine Transformationsfunktion übergeben wird.
Um Function() auszuführen, müssen Sie zusätzlich das trusted-types-eval Schlüsselwort in Ihrer CSP script-src Direktive spezifizieren. Das unsafe-eval Schlüsselwort erlaubt auch Function(), ist jedoch weit weniger sicher als trusted-types-eval, weil es die Ausführung auch in Browsern erlauben würde, die keine trusted types unterstützen.
Zum Beispiel könnte die erforderliche CSP für Ihre Seite wie folgt aussehen:
Das Verhalten der Transformationsfunktion hängt vom spezifischen Anwendungsfall ab, der ein vom Benutzer bereitgestelltes Skript erfordert. Wenn möglich, sollten Sie die erlaubten Skripte auf genau den Code beschränken, dem Sie vertrauen, um ihn auszuführen. Wenn das nicht möglich ist, könnten Sie die Verwendung bestimmter Funktionen innerhalb des bereitgestellten Strings erlauben oder blockieren.
Beachten Sie, dass in diesen Beispielen die Verwendung von Trusted Types aus Gründen der Kürze weggelassen wurde. Für Code, der den empfohlenen Ansatz zeigt, siehe Verwendung von TrustedScript in eval().
Der folgende Code erstellt ein Function-Objekt, das zwei Argumente verwendet.
Die Argumente a und b sind formale Argumentnamen, die im Funktionskörper return a + b verwendet werden.
| ECMAScript® 2027 Language Specification # sec-function-constructor |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.