2010-08-10 27 views
5

W JavaScript, możliwe jest buforowanie wyników eval?cache eval() wynik

Na przykład byłoby wspaniale, gdybym mógł:

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

Odpowiedz

6

Można wykonać str treść funkcji i użyć New Function zamiast eval.

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

i ponownego wykorzystania go przez wywołanie fn(p1, p2,...)

lub użyć eval i dokonać str być coś

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

To. Chociaż różni się nieco od 'eval' w tym, że kod w łańcuchu nie dziedziczy zakresu lokalnego kodu zawierającego. – bobince

+0

@bobince, właśnie edytowałem to – Mic

+0

Wydaje się, że obie odpowiedzi używają PRAWIE w ten sam sposób, aby to zrobić, wspaniale! Czy jest jakaś benchamark wydajności, która jest dokładną metodą (1- tworzenie nowej funkcji z ciągiem, 2 ewalna funkcja) jest lepiej? – DuduAlul

2

Wynik „eval” zaproszenia jest ocenić JavaScript. JavaScript (w przeglądarkach) nie oferuje żadnej funkcji "kompilacji".

Najbliżej można dostać (za pomocą eval) wynosi:

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

Następnie można wywołać cached_func później.

+1

co powiesz na nie w przeglądarkach? – DuduAlul

+0

Zobacz [tutaj] (http://code.google.com/apis/v8/get_started.html), aby zapoznać się z przykładem użycia 'Script :: Compile' z silnikiem Google V8 JavaScript. – sje397

1

Dodać funkcję, która ocenia i zapisuje wynik w obiekcie cache do wyszukiwania asynchronicznym :

var Cache = { } ; 

function evalString(string) { 

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

} 

Możesz wtedy zadzwonić że kod tak:

Cache.evalResult(/* arguments */) ; 

Na marginesie, „eval jest zły”, jak http://www.jslint.com powie, ponieważ może otworzyć drzwi dla zewnętrznej manipulacji treści. Dlaczego musisz eval, który to działa na pierwszym miejscu?

+0

Mam ciąg znaków, który należy poddać ocenie ... – DuduAlul