Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Eingebaute Standardobjekte
  5. Function
  6. Function()

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

Funktion() Konstruktor

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.

Warnung:Die Argumente, die an diesen Konstruktor übergeben werden, werden dynamisch geparst und als JavaScript ausgeführt.APIs wie diese sind bekannt alsInjection-Punkte und stellen potenziell einen Vektor fürCross-Site-Scripting (XSS) Angriffe dar.

Sie können dieses Risiko mindern, indem Sie stetsTrustedScript Objekte anstelle von Strings übergeben undTrusted Types durchsetzen.

SieheSicherheitsüberlegungen für mehr Informationen.

DerFunction() Konstruktor erstelltFunction Objekte. Das direkte Aufrufen des Konstruktors kann Funktionen dynamisch erstellen, leidet jedoch an Sicherheits- und ähnlichen (aber weit weniger signifikanten) Leistungsproblemen wieeval(). Im Gegensatz zueval (das Zugriff auf den lokalen Kontext haben kann) erstellenFunction-Konstruktoren Funktionen, die nur im globalen Kontext ausgeführt werden.

Probieren Sie es aus

const sum = new Function("a", "b", "return a + b");console.log(sum(2, 6));// Expected output: 8

Syntax

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

Hinweis:Function() kann mit oder ohnenew aufgerufen werden. Beides erstellt eine neueFunction Instanz.

Parameter

arg1, …,argNOptional

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 einfacherIdentifier,Restparameter oderdestrukturierter Parameter, wahlweise mit einemStandardwert), 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.)

functionBody

EinTrustedScript oder ein String, der die JavaScript-Anweisungen enthält, die die Funktionsdefinition umfassen.

Ausnahmen

SyntaxError

Funktionsparameter-Argumente können nicht als gültige Parameterliste geparst werden, oder derfunctionBody kann nicht als gültige JavaScript-Anweisungen geparst werden.

TypeError

Ein Parameter ist ein String, wennTrusted Typesdurch eine CSP erzwungen werden und keine Standardrichtlinie definiert ist.

Beschreibung

Function-Objekte, die mit demFunction-Konstruktor erstellt wurden, werden beim Erstellen der Funktion geparst. Dies ist weniger effizient als die Erstellung einer Funktion mit einemFunktionsausdruck oder einerFunktionsdeklaration 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:

js
`function anonymous(${args.join(",")}) {${functionBody}}`;

Dies ist beobachtbar durch den Aufruf dertoString() Methode der Funktion.

Im Gegensatz zu normalenFunktionsausdrücken wird der Nameanonymous jedoch nicht demfunctionBody-Scope hinzugefügt, dafunctionBody nur Zugriff auf den globalen Scope hat. Wenn sichfunctionBody nicht imstrict mode befindet (der Body selbst muss die"use strict" Direktive haben, da er die Striktheit nicht vom Kontext erbt), können Siearguments.callee verwenden, um auf die Funktion selbst zu verweisen. Alternativ können Sie den rekursiven Teil als innere Funktion definieren:

js
const recursiveFn = new Function(  "count",  `(function recursiveFn(count) {  if (count < 0) {    return;  }  console.log(count);  recursiveFn(count - 1);})(count);`,);

Beachten Sie, dass die beiden dynamischen Teile der zusammengestellten Quelle — die Parameterlisteargs.join(",") undfunctionBody — zuerst separat geparst werden, um sicherzustellen, dass sie jeweils syntaktisch korrekt sind. Dies verhindert versuchsweise Injection-Versuche.

js
new Function("/*", "*/) {");// SyntaxError: Unexpected end of arg string// Doesn't become "function anonymous(/*) {*/) {}"

Sicherheitsüberlegungen

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ürCross-Site-Scripting (XSS) Angriffe. Zum Beispiel geht das folgende Beispiel davon aus, dass deruntrustedCode von einem Nutzer bereitgestellt wurde:

js
const untrustedCode = "alert('Potentially evil code!');";const adder = new Function("a", "b", untrustedCode);

Websites mit einerContent Security Policy (CSP), diescript-src oderdefault-src spezifiziert, werden das Ausführen solchen Codes standardmäßig verhindern. Wenn Sie die Ausführung von Skripten überFunction() zulassen müssen, können Sie diese Probleme mindern, indem Sie stetsTrustedScript Objekte anstelle von Strings zuweisen, undTrusted Types durchsetzen unter Verwendung derrequire-trusted-types-for CSP-Direktive. Dies stellt sicher, dass die Eingabe durch eine Transformationsfunktion übergeben wird.

UmFunction() auszuführen, müssen Sie zusätzlich dastrusted-types-eval Schlüsselwort in Ihrer CSPscript-src Direktive spezifizieren. Dasunsafe-eval Schlüsselwort erlaubt auchFunction(), ist jedoch weit weniger sicher alstrusted-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:

http
Content-Security-Policy: require-trusted-types-for 'script'; script-src '<your_allowlist>' 'trusted-types-eval'

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.

Beispiele

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, sieheVerwendung vonTrustedScript ineval().

Argumente mit dem Function-Konstruktor spezifizieren

Der folgende Code erstellt einFunction-Objekt, das zwei Argumente verwendet.

js
// Example can be run directly in your JavaScript console// Create a function that takes two arguments, and returns the sum of those argumentsconst adder = new Function("a", "b", "return a + b");// Call the functionadder(2, 6);// 8

Die Argumentea undb sind formale Argumentnamen, die im Funktionskörperreturn a + b verwendet werden.

Erstellen eines Funktionsobjekts aus einer Funktionsdeklaration oder einem Funktionsausdruck

js
// The function constructor can take in multiple statements separated by a semicolon. Function expressions require a return statement with the function's name// Observe that new Function is called. This is so we can call the function we created directly afterwardsconst sumOfArray = new Function(  "const sumArray = (arr) => arr.reduce((previousValue, currentValue) => previousValue + currentValue); return sumArray",)();// call the functionsumOfArray([1, 2, 3, 4]);// 10// If you don't call new Function at the point of creation, you can use the Function.call() method to call itconst findLargestNumber = new Function(  "function findLargestNumber (arr) { return Math.max(...arr) }; return findLargestNumber",);// call the functionfindLargestNumber.call({}).call({}, [2, 4, 1, 8, 5]);// 8// Function declarations do not require a return statementconst sayHello = new Function(  "return function (name) { return `Hello, ${name}` }",)();// call the functionsayHello("world");// Hello, world

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-function-constructor

Browser-Kompatibilität

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2026 Movatter.jp