我正在比较 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
变量的范围有关。
由于 scope chain,在 JavaScript 中访问全局比访问本地要慢得多- 简而言之,由于 JavaScript 是一种动态语言,每次您在代码中使用名为 test
的符号时,JS 引擎都需要“查找”并查看该符号实际表示的内容(它在哪里定义)。在此查找中,全局变量是它查找的最后位置。因此,访问局部变量比访问全局变量快得多。
在代码的第一部分,变量 test
是一个全局变量,因此循环的每次迭代都需要解释器进行完整查找才能找到它。但是,在您定义的函数中,test
在本地重新定义,使其访问速度更快。
这是一个 jsperf slug这表明了这一点。
关于javascript - 为什么 new Function(code) 比直接执行相同的代码更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077848/