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

Why new Function(code) is faster than directly executing the same code?

本文关键字:代码 执行 新函数 函数 为什么      更新时间:2023-09-26

我比较了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));

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

由于作用域链的原因,在JavaScript中访问全局要比访问本地慢得多——简单地说,由于JavaScript是一种动态语言,每次在代码中使用一个名为test的符号时,JS引擎都需要"查找"该符号,并查看该符号实际代表的内容(定义位置)。在这个查找中,全局变量是它最后查找的位置。因此,访问局部变量要比访问全局变量快得多。

在代码的第一部分中,变量test是一个全局变量,因此循环的每次迭代都需要解释器进行全面查找才能找到它。然而,在您定义的函数中,test是在本地重新定义的,因此访问速度要快得多。

这里有一个jsperf段塞显示了这一点。