2014-12-05 11 views
6

Wenn ich eine Funktion in einen String so:Anruf JavaScript-Funktion in einem String codiert

var functionString = function (message) { 
    console.log(message); 
}.toString(); 

Gibt es einen Weg, um die Zeichenfolge wieder in Funktion und rufen sie zu konvertieren? Ich versuchte

eval(functionString) 

die "Uncaught Syntaxerror: unerwartetes Token" zurückgibt, und

functionString.call(this, "HI!"); 

, die 'nicht definiert ist keine Funktion' zurückgibt.

Ist das überhaupt in Javascript möglich?

Vielen Dank im Voraus für eine Antwort!

EDIT: Der Punkt dieser Frage ist, dass die Funktion mit toString() in eine Zeichenfolge konvertiert wurde. So

console.log(functionString); 

gibt diese Zeichenfolge: "-Funktion (message) {console.log (Nachricht);}"

Kann ich verwandle die Zeichenfolge wieder in Funktion und es nennen? Das ist das Problem, das ich versuche zu lösen. Danke!

+0

Es wäre hilfreich, wenn Sie genau das, was in der Zeichenfolge ist, posten würden. – Pointy

+0

Sie könnten einfach "return message.toString()" in der Funktion – ryanc1256

+0

Ist es möglich, ja kann es sein, aber was versuchst du genau zu tun? – epascarello

Antwort

2

Ihre functionString enthält genau die Zeichenfolge

"function (message) { console.log(message); }"

Auswerten es als Service-Leistung vorhanden JavaScript-Engine mit falscher Syntax tut (es gibt keinen Namen für diese Funktion). JavaScript erwartet Konstrukt wie function <name>(<params>) { }. Alternativ können Sie die anonyme Funktion (d. H. Kein Name vorhanden) verwenden, aber nur als Parameter oder in einem Kontext zum Auswerten des Ausdrucks. Der minimale typische auswertende Ausdruck wäre . Wenn Sie Lust haben wollen, ist auch !function() {} ok - das Ausrufezeichen davor verwandelt es in booleschen Ausdruck, der eine Funktionsbewertung erfordert, bevor die Ausgabe negiert wird.

in Ihrem Beispiel So wird diese Arbeit:

eval("("+functionString+")('abc')");

weil dann Sie anonymen Funktionsaufruf tun - etwas JavaScript mit leben kann.

Alternativ können Sie auch nur Klammern verwenden können, dann müssen Sie das Ergebnis etwas ordnen Sie später verwenden können:

var foo = eval("("+functionString+")"); 
foo('ddd'); 

Hier ist ein kleiner Beweis/Spielplatz darüber zu erfahren: http://jsfiddle.net/Exceeder/ydann6b3/

+0

Funktioniert, danke! Kannst du mir sagen, wofür ich googeln sollte, um mehr darüber zu erfahren, zum Beispiel die + -Funktion von functionString? – user1840267

+0

@ user1840267 das ist Verkettung ... –

+0

@ user1840267 für eval(), macht es immer sinnvoll, den tatsächlichen String auszuwerten, dann kopieren Sie es in den Editor Ihrer Wahl in leere .js-Datei einfügen und sehen, ob es syntaktisch ist richtig. –

3

Sie sind fast da, aber Sie verpassen etwas.

Wenn wir toString() auf Ihre Funktion aufrufen, erhalten wir

"function (message) { 
    console.log(message); 
}" 

der wir dann eval. Wir erstellen hier jedoch nur ein anonymes Funktionsobjekt. wir werden es nicht nennen können!

Wenn wir stattdessen etwas wie:

var functionString = "var restoredFunc = " + function (message) { 
    console.log(message); 
}.toString(); 

Wir können dann folgendermaßen

eval(functionString); 
// prints "hello!" to console 
restoredFunc("hello!"); 
+0

Das ist auch ein interessanter Ansatz, danke! +1 – user1840267

1

ja seine möglich in JavaScript, aber Sie können nicht eval anonyme Funktion ohne Zuordnung

Sie gehen also so durch

var functionString = function (message) { 
    console.log(message); 
}.toString(); 

eval("myfunction =" + functionString) 

myfunction("Hello World!") 
1

Ihre functionString ist ein String, wie

"function (message) { 
    console.log(message); 
}" 

Sie sieht, dass die Zeichenfolge in eine Sofort-Ausgeführt Funktion Ausdruck (IIFE) unter Verwendung von String-Verkettung, ähnlich wie unten verdeckte könnte.

(function (message) { 
     console.log(message); 
})("HI!"); 

und dann eval das. Hier ist das Ergebnis der Chrome-JavaScript-Konsole:

eval('(' + functionString + ')("HI!")') 
HI! 
Verwandte Themen