Wie wiederholt gesagt, ist es eine schlechte Praxis betrachtet die Function constructor (siehe auch die ECMAScript Language Specification, 5 th Auflage, § 15.3.2.1) zu verwenden:legitime Nutzungen der Funktion Konstruktor
new Function ([arg1[, arg2[, … argN]],] functionBody)
(wo alle Argumente sind Strings, die Argumentnamen enthalten und der letzte (oder einzige) String enthält den Funktionskörper).
Um rekapitulieren, so heißt es, langsam sein, wie von the Opera team erklärt:
Jedes Mal, [...] der
Function
Konstruktor an einer Schnur genannt wird Quellcode darstellt, muss das Skript Motor starten Die Maschine, die konvertiert den Quellcode in ausführbare Code. Dies ist in der Regel teuer für Leistung - leicht hundert Mal teurer als eine einfache Funktion Aufruf, zum Beispiel. (Mark ‚Tarquin‘ Wilton-Jones)
Obwohl es nicht dass schlecht, nach this post am MDC (Ich habe das nicht teste ich die aktuelle Version von Firefox, obwohl).
Crockford adds die
[d] ie Zitierkonventionen der Sprache es sehr schwierig, machen richtig eine Funktion Körper als String auszudrücken. In der Zeichenkettenform kann die frühe Fehlerüberprüfung nicht getan werden. [...] Und es ist Verschwendung von Speicher, weil jede Funktion eine eigene unabhängige Implementierung benötigt.
Ein weiterer Unterschied besteht darin, dass
eine Funktion durch eine Funktion Konstruktor definiert erbt keinen Spielraum andere als die globale Reichweite (die alle Funktionen erben). (MDC)
Davon abgesehen, müssen Sie aufmerksam seine Injektion von bösartigem Code zu vermeiden, wenn Sie einen new Function
mit dynamischen Inhalten erstellen.
Das sagte T.J. Crowder sagt in an answer dass
[t] hier ist so gut wie nie eine Notwendigkeit für die ähnlich [...] neue Funktion (...), entweder wieder mit Ausnahme von einigen fortgeschrittenen Grenzfällen.
Also, jetzt frage ich mich: Was sind diese "Advanced Edge Cases"? Gibt es legitime Verwendungen des Konstruktors Function?
ES5 im strikten Modus wird nicht geworfen, wenn 'neue Funktion' verwendet wird ... –
@ Šime: Gemäß der Spezifikation (Anhang C) sollte es:" Versuch, eine solche strikte Modusfunktion dynamisch mit der Funktion zu definieren Konstruktor (15.3.2) wird eine "SyntaxError" -Ausnahme auslösen, aber ein Test ergab, dass dies nicht der Fall ist. Versteh ich etwas falsch? –
Nun, lies den vorhergehenden Satz. Eine solche strikte Modusfunktion bezieht sich auf eine Funktion, bei der entweder der Name oder einer der Parameter entweder "eval" oder "arguments" ist. –