关于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 相关文章推荐
纯js分页代码(简洁实用)
Nov 05 Javascript
浮动的div自适应居中显示的js代码
Dec 23 Javascript
angularjs表格分页功能详解
Jan 21 Javascript
JavaScript实现点击按钮字体放大、缩小
Feb 29 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
Oct 28 Javascript
JS公共小方法之判断对象是否为domElement的实例
Nov 25 Javascript
Bootstarp基本模版学习教程
Feb 01 Javascript
字太多用...代替的方法(两种)
Mar 15 Javascript
在react中使用vuex的示例代码
Jul 30 Javascript
jQuery实现动态添加和删除input框实例代码
Mar 26 jQuery
layui 实现自动选择radio单选框(checked)的方法
Sep 03 Javascript
jQuery实现点击滚动到指定元素上的方法分析
Mar 19 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
PHP4之COOKIE支持详解
2006/10/09 PHP
PHP中date()日期函数有关参数整理
2011/07/19 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
Seajs源码详解分析
2019/04/02 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
Python中max函数用法实例分析
2015/07/17 Python
简单讲解Python中的闭包
2015/08/11 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
python3实现绘制二维点图
2019/12/04 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
农业开发项目建议书
2014/05/16 职场文书
联谊活动总结
2014/08/28 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
导游词之舟山普陀山
2019/11/06 职场文书