为什么新函数(代码)比直接执行相同代码更快?

时间:2014-09-27 18:33:54

标签: javascript performance function

我正在比较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;
&#13;
&#13;

1 个答案:

答案 0 :(得分:4)

这实际上与您创建函数的事实无关,而是与test变量的范围无关。

在JavaScript中访问全局变量比访问本地变量要慢得多,因为scope chain - 简单地说,因为JavaScript是动态语言,每次在代码中使用名为test的符号时,JS引擎需要“查找”并查看该符号实际代表的内容(定义的位置)。在此查找中,全局变量是它看起来的最后一个位置。因此,访问局部变量比访问全局变量要快得多。

在代码的第一部分中,变量test是全局变量,因此循环的每次迭代都需要从解释器中完整查找才能找到它。但是,在您定义的函数中,test在本地重新定义,使访问速度更快。

这是显示此内容的jsperf slug