Verwenden eval
Sie es nur , wenn Sie absolut keine andere Wahl haben.
Wie bereits erwähnt, wäre die Verwendung von so etwas der beste Weg, dies zu tun:
window["functionName"](arguments);
Dies funktioniert jedoch nicht mit einer Namespace-Funktion:
window["My.Namespace.functionName"](arguments); // fail
So würden Sie das machen:
window["My"]["Namespace"]["functionName"](arguments); // succeeds
Um dies zu vereinfachen und Flexibilität zu bieten, gibt es hier eine praktische Funktion:
function executeFunctionByName(functionName, context /*, args */) {
var args = Array.prototype.slice.call(arguments, 2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(context, args);
}
Sie würden es so nennen:
executeFunctionByName("My.Namespace.functionName", window, arguments);
Beachten Sie, dass Sie in einem beliebigen Kontext übergeben können. Dies würde also wie oben beschrieben erfolgen:
executeFunctionByName("Namespace.functionName", My, arguments);
My.Namespace.functionName()
,this
wird auf dasMy.Namespace
Objekt verwiesen. Aber wenn Sie anrufenexecuteFunctionByName("My.Namespace.functionName", window)
, gibt es keine Möglichkeit, sichthis
auf dasselbe zu beziehen. Möglicherweise sollte der letzte Namespace als Bereich verwendet werden, oderwindow
wenn keine Namespaces vorhanden sind. Oder Sie können dem Benutzer erlauben, den Bereich als Argument anzugeben.Ich dachte nur, ich würde eine leicht veränderte Version von Jason Bunting 'sehr hilfreicher Funktion veröffentlichen .
Erstens habe ich die erste Anweisung vereinfacht, indem ich Slice () einen zweiten Parameter gegeben habe . Die Originalversion funktionierte in allen Browsern außer IE einwandfrei.
Zweitens habe ich ersetzt dies mit Kontext in der return - Anweisung; Andernfalls zeigte dies immer auf das Fenster, wenn die Zielfunktion ausgeführt wurde.
quelle
Die Antwort auf diese andere Frage zeigt Ihnen, wie das geht: Javascript-Äquivalent zu Pythons Einheimischen ()?
Grundsätzlich kann man sagen
oder wie viele andere vorgeschlagen haben, können Sie einfach eval verwenden:
Dies ist jedoch äußerst unsicher, es sei denn, Sie sind sich absolut sicher, was Sie bewerten.
quelle
Könnten Sie das nicht einfach so machen:
Mit dieser Methode können Sie auch jedes andere JavaScript ausführen.
quelle
eval("My.Namespace.functionName()");
?var codeToExecute = "return My.Namespace.functionName()";
Ich denke, eine elegante Möglichkeit, dies zu tun, besteht darin, Ihre Funktionen in einem Hash-Objekt zu definieren. Dann können Sie mithilfe der Zeichenfolge einen Verweis auf diese Funktionen aus dem Hash haben. z.B
Dann können Sie anrufen:
Wobei customFunction eine Zeichenfolge ist, die einer in Ihrem Objekt definierten Funktion entspricht.
quelle
Mit ES6 können Sie nach Namen auf Klassenmethoden zugreifen:
die Ausgabe wäre:
quelle
Object.create()
. const myObj = {method1 () {console.log ('1')}, method2 () {console.log ('2')}} myObj ['method1'] (); // 1 myObj ['method2'] (); // 2Zwei Dinge:
Vermeiden Sie Eval, es ist schrecklich gefährlich und langsam
zweitens spielt es keine Rolle, wo Ihre Funktion existiert, "globale" -ness ist irrelevant.
x.y.foo()
kann durchx.y['foo']()
oderx['y']['foo']()
oder sogar aktiviert werdenwindow['x']['y']['foo']()
. Sie können so unbegrenzt verketten.quelle
Bei allen Antworten wird davon ausgegangen, dass auf die Funktionen über den globalen Bereich (Fenster) zugegriffen werden kann. Das OP hat diese Annahme jedoch nicht getroffen.
Wenn die Funktionen in einem lokalen Bereich (auch als Closure bezeichnet) ausgeführt werden und nicht von einem anderen lokalen Objekt referenziert werden, Pech: Sie müssen
eval()
AFAIK verwenden, siehe Dynamisches Aufrufen der lokalen Funktion in Javascriptquelle
Sie müssen nur Ihre Zeichenfolge in einen Zeiger von konvertieren
window[<method name>]
. Beispiel:und jetzt können Sie es wie einen Zeiger verwenden.
quelle
Hier ist mein Beitrag zu den hervorragenden Antworten von Jason Bunting / Alex Nazarov, in denen ich die von Crashalot angeforderte Fehlerprüfung einbeziehe.
Angesichts dieser (erfundenen) Präambel:
dann die folgende Funktion:
Mit dieser Funktion können Sie eine Javascript-Funktion anhand eines Namens aufrufen, der in einer Zeichenfolge mit oder ohne Argument (einschließlich Array-Objekten) gespeichert ist, und Feedback zu aufgetretenen Fehlern geben (hoffentlich abfangen).
Die Beispielausgabe zeigt, wie es funktioniert:
quelle
if( typeof context[ functionName ] !== 'function' )
Kontext - window - definiert ist, ein Objekt und ein Array ist, aber das Fenster ['abcd'] existiert nicht, da es im akzeptierten als Problem identifiziert wurde Antwort:window["My.Namespace.functionName"](arguments); // fail
Je nachdem, wo Sie sich befinden, können Sie auch Folgendes verwenden:
oder in nodejs
quelle
Wenn Sie eine Funktion eines Objekts anstelle einer globalen Funktion mit aufrufen möchten
window["functionName"]
. Du kannst es so machen;Beispiel:
quelle
ACHTUNG!!!
Man sollte aus zwei Gründen versuchen, das Aufrufen einer Funktion per String in JavaScript zu vermeiden:
Grund 1: Einige Code-Verschleierer zerstören Ihren Code, da sie die Funktionsnamen ändern und die Zeichenfolge ungültig machen.
Grund 2: Es ist viel schwieriger, Code zu verwalten, der diese Methode verwendet, da es viel schwieriger ist, die Verwendung der von einer Zeichenfolge aufgerufenen Methoden zu finden.
quelle
Hier ist mein Es6-Ansatz, mit dem Sie Ihre Funktion anhand ihres Namens als Zeichenfolge oder ihres Funktionsnamens aufrufen und verschiedene Arten von Argumenten an verschiedene Arten von Funktionen übergeben können:
quelle
Überrascht, dass setTimeout nicht erwähnt wurde.
So führen Sie eine Funktion ohne Argumente aus:
So führen Sie eine Funktion mit Argumenten aus:
So führen Sie eine Funktion mit tiefem Namespace aus:
quelle
runMe
mit ein paar Argumenten aufrufen würden .Also, wie andere sagten, ist definitiv die beste Option:
Und wie Jason Bunting sagte , funktioniert es nicht, wenn der Name Ihrer Funktion ein Objekt enthält:
Hier ist meine Version einer Funktion, die alle Funktionen nach Namen ausführt (einschließlich eines Objekts oder nicht):
quelle
Eine OOP-Lösung ...
quelle
Noch ein Detail zu den Posts von Jason und Alex. Ich fand es hilfreich, dem Kontext einen Standardwert hinzuzufügen. Einfach
context = context == undefined? window:context;
am Anfang der Funktion setzen. Sie könnenwindow
zu einem beliebigen bevorzugten Kontext wechseln und müssen dann nicht jedes Mal dieselbe Variable übergeben, wenn Sie dies in Ihrem Standardkontext aufrufen.quelle
Um die Antwort von Jason Bunting zu ergänzen: Wenn Sie Nodejs oder ähnliches verwenden (und dies funktioniert auch in Dom Js), können Sie
this
stattdessenwindow
(und denken Sie daran: eval is evil :quelle
In meinem Code ist etwas sehr Ähnliches. Ich habe eine vom Server generierte Zeichenfolge, die einen Funktionsnamen enthält, den ich als Rückruf für eine Bibliothek eines Drittanbieters übergeben muss. Ich habe also einen Code, der den String nimmt und einen "Zeiger" auf die Funktion zurückgibt, oder null, wenn er nicht gefunden wird.
Meine Lösung war der " sehr hilfreichen Funktion von Jason Bunting " * sehr ähnlich , obwohl sie nicht automatisch ausgeführt wird und der Kontext immer im Fenster angezeigt wird. Dies kann jedoch leicht geändert werden.
Hoffentlich ist dies für jemanden hilfreich.
quelle
Es gibt auch einen sehr hilfreichen Weg.
http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx
quelle
Ich kann nicht widerstehen, einen anderen Trick zu erwähnen, der hilft, wenn Sie eine unbekannte Anzahl von Argumenten haben, die auch als Teil der Zeichenfolge übergeben werden, die den Funktionsnamen enthält. Zum Beispiel:
var annoyingstring = 'call_my_func(123, true, "blah")';
Wenn Ihr Javascript auf einer HTML-Seite ausgeführt wird, benötigen Sie lediglich einen unsichtbaren Link. Sie können eine Zeichenfolge an das
onclick
Attribut übergeben und dieclick
Methode aufrufen .<a href="#" id="link_secret"><!-- invisible --></a>
Oder erstellen Sie das
<a>
Element zur Laufzeit.quelle
Am einfachsten ist es, darauf zuzugreifen, als hätte es ein Element
ist das gleiche wie
quelle
Sie können die Javascript-Funktion in
eval("functionname as string")
beiden aufrufen . Wie unten: (eval ist reine Javascript-Funktion)Arbeitsbeispiel: https://jsfiddle.net/suatatan/24ms0fna/4/
quelle
Das funktioniert bei mir:
Ich hoffe das funktioniert.
quelle
Ich glaube nicht, dass Sie komplizierte Zwischenfunktionen oder Auswertungen benötigen oder von globalen Variablen wie window abhängig sind:
Es funktioniert auch mit importierten Funktionen:
quelle
Ohne Verwendung können
eval('function()')
Sie mit eine neue Funktion erstellennew Function(strName)
. Der folgende Code wurde mit FF, Chrome, IE getestet.quelle
quelle
Einfach aussehen:
Bestehende andere Typfunktion ist Klasse und Aussehen Beispiel nils petersohn
quelle
Danke für die sehr hilfreiche Antwort. Ich benutze die Funktion von Jason Bunting in meinen Projekten.
Ich habe es erweitert, um es mit einem optionalen Zeitlimit zu verwenden, da die normale Methode zum Festlegen eines Zeitlimits nicht funktioniert. Siehe abhishekisnots Frage
quelle