关于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客户端快捷键管理类的较完整实现和应用
Jun 08 Javascript
javascript 闭包疑问
Dec 30 Javascript
functional继承模式 摘自javascript:the good parts
Jun 20 Javascript
JS实现窗口加载时模拟鼠标移动的方法
Jun 03 Javascript
基于JS实现简单的样式切换效果代码
Sep 04 Javascript
JavaScript各类型的关系图解
Oct 16 Javascript
JavaScript的兼容性与调试技巧
Nov 22 Javascript
使用BootStrap实现悬浮窗口的效果
Dec 13 Javascript
angularjs实现多张图片上传并预览功能
Feb 24 Javascript
浅谈Javascript常用正则表达式应用
Mar 08 Javascript
vue+element实现表格新增、编辑、删除功能
May 28 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 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读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
Smarty模板语法详解
2019/07/20 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
js function定义函数使用心得
2010/04/15 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
python实现的简单RPG游戏流程实例
2015/06/28 Python
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
python 如何区分return和yield
2020/09/22 Python
Python 列表反转显示的四种方法
2020/11/16 Python
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
献爱心倡议书
2014/04/14 职场文书
离职信范本
2015/06/23 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
2019年教师节活动策划方案
2019/09/09 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js