关于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 相关文章推荐
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
Apr 23 Javascript
jquery 获取标签名(tagName)示例代码
Jul 11 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
Sep 04 Javascript
js实现下拉列表选中某个值的方法(3种方法)
Dec 17 Javascript
去除字符串左右两边的空格(实现代码)
May 12 Javascript
AngularJS基于MVC的复杂操作实例讲解
Dec 31 Javascript
微信小程序的部署方法步骤
Sep 04 Javascript
Postman的下载及安装教程详解
Oct 16 Javascript
js实现鼠标拖拽缩放div实例代码
Mar 25 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
layer.js之回调销毁对话框的例子
Sep 11 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
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
node.js的事件机制
2017/02/08 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
Python help()函数用法详解
2014/03/11 Python
Python构造函数及解构函数介绍
2015/02/26 Python
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python流程控制 while循环实现解析
2019/09/02 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
家长给小学生的评语
2014/01/30 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
yy婚礼主持词
2014/03/14 职场文书
实习报告评语
2014/04/26 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js