我正在比较eval(code)
和new Function(code)
之间的执行时间。
我发现new Function(code)
比直接执行相同的代码更快。
是什么原因?
var start = new Date().getTime();
var test = ''; for (var i = 0; i < 1000000; ++i) { test += 'a'; }
var end = new Date().getTime();
console.log('Execution time: ' + (end - start));
// vs.
var start2 = new Date().getTime();
var f = new Function("var test = ''; for (var i = 0; i < 1000000; ++i) { test += 'a'; }");
f();
var end2 = new Date().getTime();
console.log('Execution time: ' + (end2 - start2));
&#13;
答案 0 :(得分:4)
这实际上与您创建函数的事实无关,而是与test
变量的范围无关。
在JavaScript中访问全局变量比访问本地变量要慢得多,因为scope chain - 简单地说,因为JavaScript是动态语言,每次在代码中使用名为test
的符号时,JS引擎需要“查找”并查看该符号实际代表的内容(定义的位置)。在此查找中,全局变量是它看起来的最后一个位置。因此,访问局部变量比访问全局变量要快得多。
在代码的第一部分中,变量test
是全局变量,因此循环的每次迭代都需要从解释器中完整查找才能找到它。但是,在您定义的函数中,test
在本地重新定义,使访问速度更快。
这是显示此内容的jsperf slug。