关于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 firefox不显示本地预览图片问题的解决方法
Nov 12 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
Nov 23 Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 Javascript
简单实现JS对dom操作封装
Dec 02 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
Dec 16 Javascript
使用node+vue.js实现SPA应用
Jan 28 Javascript
JS控件bootstrap datepicker使用方法详解
Mar 25 Javascript
详解vue数据渲染出现闪烁问题
Jun 29 Javascript
vue中component组件的props使用详解
Sep 04 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
Jul 12 Javascript
解决vue中el-tab-pane切换的问题
Jul 19 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
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
javascript 计算两个整数的百分比值
2009/12/26 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
Python 获取当前所在目录的方法详解
2017/08/02 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
应用服务器有那些
2012/01/19 面试题
电子商务专业推荐信范文
2013/12/02 职场文书
《手指教学》反思
2014/02/14 职场文书
供货协议书范本
2014/04/22 职场文书
2014年内勤工作总结
2014/11/24 职场文书
房屋质量投诉书
2015/07/02 职场文书
《比尾巴》教学反思
2016/02/24 职场文书