2010-08-10 111 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