2010-08-10 6 views
5

In Javascript, ist es möglich, die Ergebnisse von eval zwischenzuspeichern?cache eval() Ergebnis

Zum Beispiel wäre es toll, wenn ich könnte:

var str="some code..."; 
var code = eval(str); 
//later on... 
code.reExecute(); 

Antwort

6

Sie können str den Körper einer Funktion machen und New Function anstelle von eval verwenden.

var fn = new Function([param1, param2,...], str); 

Und es Wiederverwendung von fn(p1, p2,...)

Aufruf Oder eval und str macht so etwas wie

var fn = eval("(function(a){alert(a);})") 
+1

Dies. Obwohl es etwas anders ist als "eval", weil der Code in der Zeichenfolge nicht den lokalen Bereich des enthaltenen Codes erbt. – bobince

+0

@bobince, Ich habe es gerade bearbeitet – Mic

+0

Es scheint, als ob beide Antworten fast die gleiche Art und Weise verwenden, es ist großartig! Gibt es irgendeine Performance benchamark die genaue Methode (1- Erstellen neuer Funktion mit einer Zeichenfolge, 2- eval eine Funktion) ist besser? – DuduAlul

2

Das Ergebnis der ‚eval‘ Ruf ist das Javascript zu bewerten. Javascript (in Browsern) bietet keinerlei "Kompilierfunktion".

Die nächstgelegene Sie (mit eval) bekommen könnte, ist:

var cached_func = eval('function() {' + str + '}'); 

Dann können Sie die cached_func später an.

+1

wie wäre es nicht in Browsern? – DuduAlul

+0

Unter [hier] (http://code.google.com/apis/v8/get_started.html) finden Sie ein Beispiel für die Verwendung von 'Script :: Compile' mit Googles V8-JavaScript-Engine. – sje397

1

eine Funktion machen, dass das Ergebnis in einem Cache-Objekt auswertet und speichert für asynchronen Abruf :

var Cache = { } ; 

function evalString(string) { 

    var evaluated = eval(string) ; 
     Cache.evalResult = evaluated ; 

} 

Sie können dann anrufen dass Code wie folgt:

Cache.evalResult(/* arguments */) ; 

Auf einer Seite zur Kenntnis, „eval ist böse“, wie http://www.jslint.com wird Ihnen sagen, da es die Tür für eine externe Manipulation Ihrer Inhalte öffnen können. Warum brauchen Sie eval, die es in erster Linie funktionieren?

+0

Ich habe eine Zeichenfolge, die ausgewertet werden muss ... – DuduAlul