关于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 相关文章推荐
Prototype Template对象 学习
Jul 19 Javascript
JavaScript面向对象(极简主义法minimalist approach)
Jul 17 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
使用JavaScript实现ajax的实例代码
May 11 Javascript
学好js,这些js函数概念一定要知道【推荐】
Jan 19 Javascript
JS+HTML5 FileReader对象用法示例
Apr 07 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
Jun 29 Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
May 10 Javascript
JavaScript如何实现防止重复的网络请求的示例
Jan 28 Javascript
关于Javascript闭包与应用的详解
Apr 22 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
PHP PDO函数库详解
2010/04/27 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
分享php多功能图片处理类
2016/05/15 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
详解php用static方法的原因
2018/09/12 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python3音乐播放器简单实现代码
2020/04/20 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python批量修改图片大小的方法
2018/07/24 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
东方电视购物:东方CJ
2016/10/12 全球购物
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
公司承诺书怎么写
2014/05/24 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
Python中else的三种使用场景
2021/06/16 Python
欧元符号 €
2022/02/17 杂记