关于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获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
May 21 Javascript
innerText 使用示例
Jan 23 Javascript
js中的json对象详细介绍
Oct 29 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 Javascript
React.js入门实例教程之创建hello world 的5种方式
May 11 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
Jan 18 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
Feb 09 Javascript
基于JavaScript实现的折半查找算法示例
Apr 14 Javascript
JS实现自定义状态栏动画文字效果示例
Oct 12 Javascript
bootstrap table支持高度百分比的实例代码
Feb 28 Javascript
element-ui 文件上传修改文件名的方法示例
Nov 05 Javascript
jQuery操作元素追加内容示例
Jan 10 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 mysql索引问题
2008/06/07 PHP
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
vue实现购物车小案例
2019/09/27 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
在Python的循环体中使用else语句的方法
2015/03/30 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
用Python解数独的方法示例
2019/10/24 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
物业管理毕业生个人的求职信
2013/11/30 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android