2010-10-15 19 views
25

Gibt es eine Möglichkeit, dass ich eine Funktion als JSON-Zeichenfolge übergeben kann (Konvertierung mit JSON.Stringify), senden Sie es an eine andere Funktion, analysieren Sie die JSON und führen Sie dann die Funktion, die in der JSON war ? Ich benutze jQuery und Javascript.übergeben Sie Funktion in JSON und führen

Antwort

19

Hier ist ein Arbeits example

Grundsätzlich muss man mit dieser Art der Sache vorsichtig sein. Wenn Sie eine vorhandene JavaScript-Funktion verwenden, drehen Sie sie in eine Zeichenfolge und überprüfen Sie, ob es zu Problemen bei der Funktionserkennung kommt. Wenn Sie einfach eine Funktion Zeichenfolge vom Server zu nehmen und Sie wollen es ausführen, können Sie tun, was ich an diesem jsfiddle tat:

Javascript

var myFunc = "function test() {alert('test');}"; 

$(document).ready(function() { 
    var data = new Object(); 
    data.func = myFunc; 
    var jsonVal = $.toJSON(data); 
    var newObj = $.evalJSON(jsonVal); 
    eval(newObj.func); 
    test(); 
});​ 
+0

cool - danke für diese – amateur

-7

Nein, das geht nicht. Funktionen können nicht serialisiert werden. Anstatt das Objekt in JSON zu konvertieren, könnten Sie es direkt an die andere Funktion übergeben, ohne JSON.stringify aufzurufen.

+0

Ich habe das Gefühl, er hat einen Draht durchqueren somewhere ... – jcolebrand

+19

JSON = JavaScript Object Notation - natürlich kann die Funktion serialisiert und hin- und hergereicht werden. Was ist ein Objekt? So ziemlich alles in JS, Funktionen enthalten. Ärgern Sie sich, wenn jemand "Nein" sagt, wenn "JA" die richtige Antwort ist. Besser zu sagen "nicht dass ich mir dessen bewusst bin". Bill –

+0

Ich würde zehnmal denken, bevor ich sage, dass SMT in JavaScript nicht möglich ist :) Kaum kann sich sogar ein paar "NEIN" s in JS per se erinnern. "WIE" und "WARUM NICHT" sind die häufigsten Fragen. –

19

Ja, Sie können eine Funktion mit der Methode toString() in eine Zeichenfolge konvertieren.

Here's an example zeigen eine Funktion Konvertierung in einen String zu einer Funktion und zurück:

var myfunc = function() { 
    alert('It works!'); 
} 

var as_string = myfunc.toString(); 

as_string = as_string.replace('It works', 'It really works'); 

var as_func = eval('(' + as_string + ')'); 

as_func(); 
+0

Dieser Programmieransatz öffnet wirklich Ihre Meinung. – zardilior

47

Ja, können Sie. Es gibt Unmengen von Möglichkeiten, dies zu tun.

Und es gibt keine Notwendigkeit, die „böse“ eval-Funktion zu verwenden (bitte yahoogle warum es vermieden werden soll), wie hier darauf hingewiesen: http://javascript.about.com/library/bleval.htm

var tmpFunc = new Function(codeToRun); 
tmpFunc(); 

Ob es sollte JSON zu jedem Zeitpunkt irrelevant sein.

+8

+1 für "yahoogle". Ist Bing nicht populärer als Yahoo in diesen Tagen? Wäre das "bingle"? Oder der längere Satz, den Scott Hanselman bei Präsentationen "Google it on Bing" verwendet hat? – GregL

+0

Ich stimme @GregL zu, aber ich habe diesen Satz vor einiger Zeit geprägt und möchte ihn einfach nicht loslassen! Mit "Bingle", "Bingoogle" ... klingt einfach nicht richtig zu mir. Außerdem gibt es viele Wörter und Sprichwörter in der englischen Sprache, die sich auf veraltete Dinge beziehen ... – EasierSaidThanDone

+2

YabingleYabingleGo – Automatico

3

habe ich eine Gabel von JSONfn mit den Objekten und ihre Prototypen stringify und analysieren kann. In meinen grundlegenden Tests hat es gut funktioniert.

https://github.com/cgarciae/jsonfn

-2

// In jquery Bibliothek

Klick mich

var jsonFun = { 
    fun1 : function(){ 
    alert('Done'); 
    } 
} 

$('button').click(function(){ 
    jsonFun.fun1(); 
}); 

Dies ist ich die beste Art und Weise erraten Funktion in JSON passieren

Verwandte Themen