关于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 相关文章推荐
浅析jquery的js图表组件highcharts
Mar 06 Javascript
探讨JavaScript中的Rest参数和参数默认值
Jul 29 Javascript
Grunt入门教程(自动任务运行器)
Aug 06 Javascript
js实现页面跳转的几种方法小结
May 16 Javascript
改变checkbox默认选中状态及取值的实现代码
May 26 Javascript
JS简单实现tab切换效果的多窗口显示功能
Sep 07 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
Mar 11 Javascript
js字符串与Unicode编码互相转换
May 17 Javascript
js使用html2canvas实现屏幕截取的示例代码
Aug 28 Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
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 ci框架验证码实例分析
2013/06/26 PHP
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
jQuery+pjax简单示例汇总
2017/04/21 jQuery
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
Python复制目录结构脚本代码分享
2015/03/06 Python
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python读取并写入mat文件的方法
2019/07/12 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
python的链表基础知识点
2020/09/13 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
外贸英语专业求职信范文
2013/12/25 职场文书
作文评语怎么写
2014/12/25 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
python装饰器代码解析
2022/03/23 Python
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android