关于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高级程序设计 错误处理与调试学习笔记
Sep 10 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
Mar 03 Javascript
JavaScript中数组添加值和访问值常见问题
Feb 06 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
Apr 06 Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 Javascript
D3.js实现文本的换行详解
Oct 14 Javascript
关于json字符串与实体之间的严格验证代码
Nov 10 Javascript
jQuery加载及解析XML文件的方法实例分析
Jan 22 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
Feb 15 Javascript
js canvas实现橡皮擦效果
Dec 20 Javascript
通过实践编写优雅的JavaScript代码
May 30 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的图形函数中显示汉字
2006/10/09 PHP
php简单静态页生成过程
2008/03/27 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
深入理解Javascript中的循环优化
2013/11/09 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
JavaScript中实现map功能代码分享
2015/06/11 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
单位门卫岗位职责
2013/12/20 职场文书
领导的自我鉴定
2013/12/28 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
精彩广告词大全
2014/03/19 职场文书
家长通知书教师评语
2014/04/17 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
2014年司法局工作总结
2014/12/11 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
入门学习Go的基本语法
2021/07/07 Golang
浅谈Python中对象是如何被调用的
2022/04/06 Python