Baseline Widely available
Der Function()
-Konstruktor erstellt Function
-Objekte. Der direkte Aufruf des Konstruktors kann Funktionen dynamisch erstellen, leidet jedoch unter Sicherheits- und ähnlichen (aber weit weniger signifikanten) Leistungsproblemen wie eval()
. Im Gegensatz zu eval
(das möglicherweise Zugriff auf den lokalen Gültigkeitsbereich hat) erstellt der Function
-Konstruktor Funktionen, die nur im globalen Gültigkeitsbereich ausgeführt werden.
const sum = new Function("a", "b", "return a + b");
console.log(sum(2, 6));
// Expected output: 8
Syntax
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 ohne new
aufgerufen werden. Beide Varianten erstellen eine neue Function
-Instanz.
arg1
, â¦, argN
Optional
Namen, die von der Funktion als formale Argumentnamen verwendet werden sollen. Jeder muss ein String sein, der einem gültigen JavaScript-Parameter entspricht (entweder ein einfacher Identifier, Restparameter oder destrukturierter Parameter, eventuell mit einem Standardwert), oder eine Liste solcher Strings, durch Kommas getrennt.
Da die Parameter auf dieselbe Weise analysiert werden wie Funktionsausdrücke, werden Leerzeichen und Kommentare akzeptiert. Zum Beispiel: "x", "theValue = 42", "[a, b] /* numbers */"
â oder "x, theValue = 42, [a, b] /* numbers */"
. ("x, theValue = 42", "[a, b]"
ist ebenfalls korrekt, aber sehr schwer zu lesen.)
functionBody
Ein String, der die JavaScript-Anweisungen enthält, die die Funktionsdefinition bilden.
Function
-Objekte, die mit dem Function
-Konstruktor erstellt werden, werden beim Erstellen der Funktion analysiert. Dies ist weniger effizient als das Erstellen einer Funktion mit einem Funktionsausdruck oder einer Funktionsdeklaration und das Aufrufen innerhalb Ihres Codes, da solche Funktionen mit dem Rest des Codes analysiert werden.
Alle an die Funktion übergebenen Argumente, auÃer dem letzten, werden als die Namen der Identifikatoren der Parameter in der zu erstellenden Funktion betrachtet, in der Reihenfolge, in der sie übergeben werden. Die Funktion wird dynamisch als Funktionsausdruck kompiliert, wobei die Quelle in der folgenden Weise zusammengefügt wird:
`function anonymous(${args.join(",")}
) {
${functionBody}
}`;
Dies kann durch Aufruf der toString()
-Methode der Funktion beobachtet werden.
Anders als bei normalen Funktionsausdrücken wird jedoch der Name anonymous
nicht zum Gültigkeitsbereich von functionBody
hinzugefügt, da functionBody
nur Zugriff auf den globalen Gültigkeitsbereich hat. Wenn functionBody
sich nicht im strict mode befindet (der Körper selbst muss die "use strict"
-Direktive haben, da er die Striktheit nicht aus dem Kontext übernimmt), können Sie arguments.callee
verwenden, um auf die Funktion selbst zu verweisen. Alternativ können Sie den rekursiven Teil als innere Funktion definieren:
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 zusammengefügten Quelle â die Parameterliste args.join(",")
und functionBody
â zuerst separat analysiert werden, um sicherzustellen, dass sie jeweils syntaktisch gültig sind. Dies verhindert versuchsweise Injection-ähnliche Manipulationen.
new Function("/*", "*/) {");
// SyntaxError: Unexpected end of arg string
// Doesn't become "function anonymous(/*) {*/) {}"
Beispiele Argumente mit dem Function-Konstruktor angeben
Der folgende Code erstellt ein Function
-Objekt, das zwei Argumente entgegennimmt.
// Example can be run directly in your JavaScript console
// Create a function that takes two arguments, and returns the sum of those arguments
const adder = new Function("a", "b", "return a + b");
// Call the function
adder(2, 6);
// 8
Die Argumente a
und b
sind formale Argumentnamen, die im Funktionskörper return a + b
verwendet werden.
// 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 afterwards
const sumOfArray = new Function(
"const sumArray = (arr) => arr.reduce((previousValue, currentValue) => previousValue + currentValue); return sumArray",
)();
// call the function
sumOfArray([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 it
const findLargestNumber = new Function(
"function findLargestNumber (arr) { return Math.max(...arr) }; return findLargestNumber",
);
// call the function
findLargestNumber.call({}).call({}, [2, 4, 1, 8, 5]);
// 8
// Function declarations do not require a return statement
const sayHello = new Function(
"return function (name) { return `Hello, ${name}` }",
)();
// call the function
sayHello("world");
// Hello, world
Spezifikationen Browser-Kompatibilität Siehe auch
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4