2010-08-10 195 views
5

在Javascript中,有沒有可能緩存eval的結果?緩存eval()結果

例如,它想如果我可以是偉大的:

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

回答

6

您可以製作str函數的主體並使用New Function而不是eval

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

,並通過調用fn(p1, p2,...)

或者使用eval重用,並str是這樣

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

這個。雖然它與'eval'稍有不同,因爲字符串中的代碼不會繼承包含代碼的本地範圍。 – bobince 2010-08-10 09:41:08

+0

@bobince,我只是編輯它 – Mic 2010-08-10 09:43:23

+0

看起來好像兩個答案使用幾乎相同的方式來做到這一點,太棒了!是否有任何性能benchamark確切的方法(1-創建一個字符串的新功能,2 eval一個函數)更好? – DuduAlul 2010-08-10 09:44:44

2

的「EVAL」調用的結果是評價的JavaScript。 Javascript(在瀏覽器中)不提供任何「編譯」功能。

你可以得到(使用eval)最接近的是:

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

然後,您可以稍後致電該cached_func

+1

不在瀏覽器中怎麼樣? – DuduAlul 2010-08-10 09:38:44

+0

請參閱[這裏](http://code.google.com/apis/v8/get_started.html),瞭解如何在Google的V8 JavaScript引擎中使用Script :: Compile。 – sje397 2010-08-11 02:39:17

1

請在緩存對象異步檢索評估,並將結果存儲功能:

var Cache = { } ; 

function evalString(string) { 

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

} 

然後您可以致電像這樣的代碼:

Cache.evalResult(/* arguments */) ; 

在一個側面說明,「EVAL是邪惡的」爲http://www.jslint.com會告訴你,因爲它可能打開門爲您的內容外部操作。爲什麼你需要eval這個功能呢?

+0

我有一個字符串必須被評估... – DuduAlul 2010-08-10 10:02:36