2012-03-27 14 views
0

Update Der Code für die Funktion/Klasse ist in einer Zeichenfolge gespeichert, weshalb ich sie nicht direkt aufrufen kann. Die Idee besteht darin, eine Introspektion für das Objekt durchzuführen und seine Datenelemente aufzulisten, was funktioniert, wenn es eine Funktion ist, aber nicht funktioniert, wenn eine Variable wie die folgende ausgewertet wird.Eval Rückgabe des Variablennamens anstelle von undefiniert. (javascript)

Ich versuche ein Objekt in Javascript zu bewerten. Etwas wie das.

var myObj { 
    greet: "Greeting", 

    myPrint: function() { 
     alert("hello"); 
    } 
}; 

Die Idee ist in der Lage sein, dies in eval zu laufen und die Variablennamen erhalten irgendwie (myObj) oder ein Objekt erstellt. Ich habe mit verschiedenen Methoden mit Eval experimentiert, kann das aber nicht herausfinden. Das funktioniert, wenn ich so etwas habe.

function myObj() { 
    this.greet = "Greeting"; 

    this.myPrint = function() { 
     alert("hello"); 
    } 
}; 

Laufeval ("(" + code + ")"); wo Code eine Zeichenfolge ist, die die obige Funktion enthält, gibt myObj() an mich zurück.

Update 2 Also im Grunde möchte ich etwas wie dies bewerten. eval ("var x = 5"); und ich versuche, x zu bekommen. Da es sich um eine Zeichenfolge handelt, die ausgewertet wird, gibt es keine Möglichkeit, sie zu entschlüsseln, abgesehen von der Analyse der Zeichenfolge, obwohl sie dem Fenster-Namespace hinzugefügt wird. Dies ist nur ein einfaches Beispiel, aber wie gesagt, es ist ein wenig schwierig mit dem ersten Code. Wie gesagt ... eval ("function test() {return 'hallo';}"); Rückgabetest() ähnlich dem, was ich für die Anweisung "var x = 5" erwarte.

Gibt es eine Möglichkeit, dies ähnlich für den 1. Fall zu tun, den ich vermisse? Vielen Dank

+4

Ich bin nicht ganz sicher, was Sie tun möchten, aber die drängendere Frage ist * warum * wollen Sie das tun? Was versuchst du zu lösen? –

+0

Grundsätzlich möchte ich alle Datenelemente einer Klasse/Funktion untersuchen. Der Code ist jedoch tatsächlich willkürlich und wird in ein Textfeld eingefügt, von dem aus ich inspizieren muss. (Stellen Sie es sich als eine Art Feature für eine IDE vor, die alle Datenelemente anzeigen kann). Ich weiß, dass das Ausführen von beliebigem Code auf eval gefährlich ist, aber das ist für einen ganz anderen Zweck. – ssarangi

+1

Ihr 'myObj' Code ist kein gültiges Javascript. Ist es sicher anzunehmen, dass es sich um einen Tippfehler handelt, oder ist dieser tatsächliche Inhalt, den Sie irgendwie bewerten müssen? –

Antwort

0

Sie können das Objekt testen, ohne die myPrint Funktion auszuführen.

Sie müssten so etwas wie

myObj.myPrint() 

tun, um den Alarm zu werfen zu bekommen.

[Bearbeiten], um sofort laufen die myPrint Funktion Ihren Code dies ändern:

var myObj = { 
    greet: "Greeting", 

    myPrint: (function() { 
     alert("hello"); 
    })(); 
    }; 
+0

Ich glaube, ich habe vergessen zu erwähnen, aber der Code für die Klasse/Funktion ist tatsächlich in einer Zeichenfolge gespeichert. Das ist der Grund, warum ich eval hier verwenden möchte. – ssarangi

+0

Aktualisierter Code zum Ausführen der Funktion. –

0

Sind Sie versuchen, dynamisch einen Rückruf zu nennen?

var myObj = { // fixed this line of code as it was missing the = 
    greet: "Greeting", // replaced ; with , 

    myPrint: function() { 
     alert("hello"); 
    } 
}; 
console.log(eval(myObj)); // returns obj as expected. 

Wenn ich in meiner Annahme richtig bin würden Sie brauchen Klammer-Notation verwenden und EVAL nicht

So benötigt, wenn Sie einen String vorbeikamen würde es so aussehen:

var str = 'myPrint'; 

var strTwo = 'greet' 

myObj[str](); // to execute the function 

myObj[strTwo]; // now contains "Greeting" 

Welche würde diese Funktion ausführen.

Hoffe, dass hilft!

Tim

EDIT:

var myObj = 'var myObj = { greet: "Greeting", myPrint: function() { alert("hello"); } }' 

console.log(eval(myObj)); 
myObj.myPrint(); 

Dann ist es das, was Sie wollen, wenn dies nicht funktioniert es bedeutet, dass Sie sind auf der Flucht nicht die Zeichenfolge richtig:

http://jsfiddle.net/XtyHh/

+0

Danke Tim, das Problem ist jedoch, dass der gesamte Code für die "var myObj = {...}" in einer Zeichenfolge ist. Das ist das Problem, vor dem ich stehe. – ssarangi

+0

'myObj [str];' würde nichts ausführen. 'myObj [str]();' würde. – jbabey

+0

ssarangi Siehe das Update ... –

0

A-Code :

var sCode = '{ great: "Greating", myPrint: function() { alert("hello!"); } }', 
    oObj = eval("(" + sCode + ")"); 

oObj.myPrint(); // alert "hello" 
console.log(oObj.great); // prints "Greating" 
+0

Hier wird sCode außerhalb der Zeichenfolge definiert. Was ich erwarte, ist etwas wie var code = "var x = {greet: 'gruß'};" Allerdings funktioniert dies mit eval ("(+ code" + ")") nicht – ssarangi

+0

Sie dürfen nicht "var x" mit 'eval()' verwenden –

Verwandte Themen