为什么新函数(代码)比直接执行相同的代码更快
Why new Function(code) is faster than directly executing the same code?
我比较了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段塞显示了这一点。
相关文章:
- setTimeout函数能否在其前面的代码执行之前激发
- 延迟代码执行,直到下载完成
- 奇怪的javascript代码执行顺序
- 将字符串作为一段 HTML/javascript 代码执行
- 使用AngularJS,如何在视图和控制器同步特定更改后触发代码执行
- onKeyUp 导致代码执行两次
- JQuery:将参数传递给插件以限制代码执行
- JavaScript代码执行时间
- 基本的JavaScript代码执行
- JavascriptCore:从本机代码执行JavaScript定义的回调函数
- 脚本标记的位置会影响代码执行
- 页面脚本未使用 Salesforce Web-to-Lead 代码执行
- GM_xmlhttpRequest 成功回调“onload”未为注入的代码执行
- 停止所有代码执行,直到 IFrame 完全加载
- 纯 Javascript 代码执行停止混合应用程序中的离子加载指示器
- Javascript代码执行顺序
- Javascript:在嵌套函数中使用条件语句停止代码执行
- Node.js代码执行顺序
- 什么触发JavaScript代码执行
- onreadystatechange导致php代码执行两次