我想要创建自己的JS框架,只为了自己的乐趣(也许以后能转化为实用),而且我大部分时间都致力于动态生成JS(因为把JS作为中间语言来使用不是一个好主意,我个人认为)。
但是我遇到了一个问题。我试图做以下操作:
var f = null;
var converted = "f = function(){ <do something here>";
for(var x in list)
converted+=list[x];
converted+="};";
eval(converted);
所以这基本上将构造函数写入f,我稍后可以执行它。但问题在于 - 它运行得比我完全在文件中编写f的代码要慢,这非常奇怪。让我解释一下为什么对我来说这很奇怪:当您每次运行eval时,Chrome预编译器(或任何浏览器预编译器 - Chrome是我针对的)无法缓存编译代码,因为它期望它会随着每次运行而更改。
然而,当您将其保存到函数中时,它会创建一个新的VM机器文件,因为在保存了函数的代码之后,您无法更改它。那么,为什么当我执行这样的eval时,它比正常执行要慢呢?我的意思是在代码被执行超过一次之后。为什么这很重要?
PS:我上面展示的方法比每次进行评估都要快。所以我不明白为什么秒表显示介于其中的时间,再次忽略第1-10个调用。
PPS:测试案例:http://jsperf.com/evaluated-function-vs-real-function/2
eval
创建的函数和常规函数之间没有性能差异:http://jsperf.com/evaluated-function-vs-real-function - Guffaf
在你的 eval 代码之外被引用。 - Sam Dufelvar converted = "var f = function() { ...";
...
converted += "}; f;"
var f = eval(converted);
但我建议使用var f = new Function(converted);
其中converted
仅为您的函数主体。 - sjrd