关于eval 与new Function 到底该选哪个?


Posted in Javascript onApril 17, 2013

废话不多说,直接上测试代码

var aa = "{name:'cola',item:[{age:11},{age:22},{age:23},{age:23}]}"; 
    var now = new Date().getTime(); 
    for (var i = 0; i < 100000; i++) { 
        var a = eval("(" + aa + ")");     } 
    var now1 = new Date().getTime(); 
    document.write("eval 时间为:" + (now1 - now) + "<br/>"); 
 
    var now2 = new Date().getTime(); 
    for (var i = 0; i < 100000; i++) { 
        var fn = new Function("return" + aa); 
        fn(); 
    } 
    var now3 = new Date().getTime(); 
    document.write("new Function时间为:" + (now3 - now2) + "<br/>");

        //经过测试结果 FF效果如下
        //eval 时间为:979
        //new Function时间为:1372

        //经过测试结果 IE8效果如下
        //eval 时间为:913
        //new Function时间为:1037

        //经过测试结果 Chrome效果如下
        //eval 时间为:211
        //new Function时间为:251

        //经过测试结果 Opera
        //eval 时间为:384
        //new Function时间为:1024

测试结果为不同浏览器测试的参考数据,觉得奇怪的是为什么每个浏览器测试的时候都是eval要快点,我们是不是要采用他呢?

亲,先不要急, 接下往下看,带着这些疑问,好奇心的我终于展开了另外一个测试,这时候我做一个动态涵数来分别让eval 和 new Function 来执行再看看效果

var testEval = function (obj) { 
         <SPAN style="COLOR: #ff0000"> return eval('0, ' + obj + '');</SPAN> 
        //return eval('( ' + obj + ')'); 
      };       var testFun = function (obj) { 
          var fn = new Function("return " + obj); 
          fn(); 
      }; 
      var now = new Date().getTime(); 
      for (var i = 0; i < 1000; i++) { 
          var fn = testEval("function test(){ document.write('我有一头小毛驴,从来也不骑.........'); }"); 
          fn(); 
      } 
      var now1 = new Date().getTime(); 
      document.write("<br/>"); 
      document.write("eval 时间为:" + (now1 - now) + "<br/>"); 
      var now2 = new Date().getTime(); 
      for (var i = 0; i < 1000; i++) { 
          testFun("document.write('我有一头小毛驴,从来也不骑.........');"); 
      } 
      var now3 = new Date().getTime(); 
      document.write("new Function时间为:" + (now3 - now2) + "<br/>");

  //经过测试结果 FF效果如下
        //eval 时间为:495
        //new Function时间为:50

        //经过测试结果 IE8效果如下
        //eval 时间为:34
        //new Function时间为:20

        //经过测试结果 Chrome效果如下
        //eval 时间为:7
        //new Function时间为:4

        //经过测试结果 Opera
        //eval 时间为:7
        //new Function时间为:18

        如上结果测试 如果构建一个动态执行让eval去执行 在FF上是超级的慢, 其它浏览器差别不大, 我们这里不必过于太多追究
        return eval('0, ' + obj + ''); 可能大家觉得这里这个 0 是什么意思,加0主要是兼容所有的浏览器,不加的话,IE9以下版本就会报错
        但是真正的0的意思 怎么去剖析 我还真不知道,只是知道加 了这个就可以解决恶心的IE不能兼容的问题
        经过上面二个栗子说明 如果是为了JSON串的转换eval 明显要快, 如果是动态涵数解析 那么 new Function要快, 这里说出了二个优劣势, 还有的就是eval兼容性不很好,如果解析出错,可能会导致其它的JS脚本不会执行,
        而 后者则不会,他只会针对于 这个Function  我这人不喜欢太麻烦的事情, 果断放弃eval 用 new Function 来代替。 如果有理解的不太对的地方,请大家指正,欢迎拍砖。

Javascript 相关文章推荐
JavaScript效率调优经验
Jun 04 Javascript
关于JavaScript中string 的replace
Apr 12 Javascript
jquery showModelDialog的使用方法示例详解
Nov 19 Javascript
对Web开发中前端框架与前端类库的一些思考
Mar 27 Javascript
浅述节点的创建及常见功能的实现
Dec 15 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
Jan 18 Javascript
element ui里dialog关闭后清除验证条件方法
Feb 26 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
Jul 06 Javascript
使用ECharts实现状态区间图
Oct 25 Javascript
node上的redis调用优化示例详解
Oct 30 Javascript
微信小程序日历插件代码实例
Dec 04 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
Dec 24 Javascript
js实现在页面上弹出蒙板技巧简单实用
Apr 16 #Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
Apr 16 #Javascript
拖动table标题实现改变td的大小(css+js代码)
Apr 16 #Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
Apr 16 #Javascript
jquery表格内容筛选实现思路及代码
Apr 16 #Javascript
js实现图片轮换效果代码
Apr 16 #Javascript
js相册效果代码(点击创建即可)
Apr 16 #Javascript
You might like
全文搜索和替换
2006/10/09 PHP
PHP版自动生成文章摘要
2008/07/23 PHP
php文件上传的例子及参数详解
2013/12/12 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
js实现转动骰子模型
2019/10/24 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python中用max()方法求最大值的介绍
2015/05/15 Python
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Python学习入门之区块链详解
2017/07/25 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
django 控制页面跳转的例子
2019/08/06 Python
python实现简单图书管理系统
2019/11/22 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
会计与审计专业大专生求职信
2013/10/03 职场文书
决心书范文
2014/03/11 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
小学信息技术教学反思
2016/02/16 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
php png失真的原因及解决办法
2021/11/17 PHP