关于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 相关文章推荐
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
Jan 09 Javascript
JS实现匀速运动的代码实例
Nov 29 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
Dec 10 Javascript
node.js中的http.response.write方法使用说明
Dec 14 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
jQuery实现的导航下拉菜单效果
Jul 04 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
最原始的jQuery注册验证方式
Oct 11 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
Oct 25 Javascript
使用Node.js给图片加水印的方法
Nov 15 Javascript
区分vue-router的hash和history模式
Oct 03 Javascript
在实例中重学JavaScript事件循环
Dec 03 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 文件系统详解
2012/09/13 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
php数据序列化测试实例详解
2017/08/12 PHP
PHP 文件上传限制问题
2019/09/01 PHP
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
keras 多任务多loss实例
2020/06/22 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
写好自荐信的技巧
2013/11/08 职场文书
高三地理教学反思
2014/01/11 职场文书
《童年》教学反思
2014/02/18 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
2014年民政工作总结
2014/11/26 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
创业计划之特色精品店
2019/08/12 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电