关于eval 与new Function 到底该选哪个?

 更新时间:2013年04月17日 11:01:00   作者:  
本篇文章小编将为大家介绍,关于eval 与new Function 到底该选哪个?有需要的朋友可以参考一下

废话不多说,直接上测试代码

复制代码 代码如下:

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 来代替。 如果有理解的不太对的地方,请大家指正,欢迎拍砖。

相关文章

  • DOM基础教程之使用DOM控制表单

    DOM基础教程之使用DOM控制表单

    这篇文章主要介绍了DOM基础教程之使用DOM控制表单的相关资料,需要的朋友可以参考下
    2015-01-01
  • JavaScript中的getDay()方法使用详解

    JavaScript中的getDay()方法使用详解

    这篇文章主要介绍了JavaScript中的getDay()方法使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-06-06
  • 详解JavaScript中的客户端消息框架设计原理

    详解JavaScript中的客户端消息框架设计原理

    这篇文章主要介绍了详解JavaScript中的客户端消息框架设计原理,包括客户端和服务器端的通信等方面的内容,需要的朋友可以参考下
    2015-06-06
  • js基石系列学习之错误类型

    js基石系列学习之错误类型

    这篇文章主要为大家介绍了js基石系列学习之错误类型示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Websocket协议详解及简单实例代码

    Websocket协议详解及简单实例代码

    这篇文章主要介绍了Websocket协议详解及简单实例代码的相关资料,这里对websocket 协议进行详细介绍,并附简单实例代码,需要的朋友可以参考下
    2016-12-12
  • JavaScript内核之基本概念

    JavaScript内核之基本概念

    本文将聚焦于JavaScript中的基本概念,这些概念与传统语言有比较大的不同,因此单独列出一章来做专门描述,理解本章的概念对书中后续章节的概念,代码的行为等会有很大的帮助,读者不妨花比较大的时间在本章,即使你对JavaScript已经比较熟悉,也建议通读本文
    2011-10-10
  • Javascript学习笔记二 之 变量

    Javascript学习笔记二 之 变量

    上面描述了数据类型,学习完数据类型就不得不提到变量。
    2010-12-12
  • JavaScript 无符号右移运算符

    JavaScript 无符号右移运算符

    无符号右移运算符 (>>>)是右移表达式的位,不保留符号。
    2009-04-04
  • 简单谈谈Javascript函数中的arguments

    简单谈谈Javascript函数中的arguments

    在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。下面这篇文章主要介绍了关于Javascript函数中的arguments面貌以及如何转化为数组的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • js创建对象的区别示例介绍

    js创建对象的区别示例介绍

    本节主要介绍了js 创建对象的区别,不同的赋值方式,导致的结果也不一样,感兴趣的朋友可以了解下
    2014-07-07

最新评论