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

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

时间: 2024-10-01 07:38:37

关于eval 与new Function 到底该选哪个?的相关文章

JS原型的问题Object和Function到底是什么关系

var F = function(){}; Objcert.prototype.a = function(){}; Function.prototype.b = function(){}; F 既能访问到a,也能访问到(Object 和 Function也同样,但是所有的实例只能访问到a):F是Object 和 Function 两个的实例,那么Object 和 Function 到底是什么关系? 下面是对Object 和 Function 的了解 F instanceof Object tru

【荐】使用eval()、new Function()将JSON字符串转换为JSON对象

在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用jQuery的each方法来遍历 用jQuery解析JSON数据的方法,作为jQuery异步请求的传输对象,jQuery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明. 这里首先

eval和new Function的区别

eval和new Function都可以动态解析和执行字符串.但是它们对解析内容的运行环境判定不同. var a = 'global scope' function b(){ var a = 'local scope' eval('console.log(a)') //local scope ;(new Function('','console.log(a)'))() //global scope } b() eval中的代码执行时的作用域为当前作用域.它可以访问到函数中的局部变量. new F

IE 当eval遇上function的处理

IE 当eval遇上function的处理 本文标签:eval function 情况1:eval里没有function,直接执行: eval("alert(ss);");//所有浏览器正确均输出 情况2:eval里有function,function立即执行: eval("(function(){alert(ss);})();");//所有浏览器正确输出 情况3:eval里有function,使用变量保存function引用并调用该function: var f=

Javascript之eval与new Function的差异

当你必须要将字符串当做代码来执行,很多人第一印象是想到使用eval,  但实际上,使用new Function会更安全 . 为什么安全?  看个例子. <script>   var a = 1;      eval("var a=2;");   //改变了当前域的变量a   alert(a);      new Function("var a=3;")();   //不改变当前作用域的变量   alert(a); </script> eval

没有对比就没有伤害——AT、DCT、CVT、AMT到底怎么选

在国内的汽车消费市场的高端领域,几乎是清一色的自动变速箱.除了少数的钢炮还坚持着MT以外,全是自动档的天下.随着自动变速箱的发展,无论是动力响应,还是可参与度都大大提高,也简化了驾驶员的手脚负担.家用车如何选择AT/DCT/CVT/AMT四种变速箱,它们到底有什么优劣势呢?作为消费者又该如何选择呢?我们逐一分析. 自动变速箱(AT) AT变速箱是采用液力变矩器来替代离合器工作,液力变矩器的工作原理就像是船的螺旋桨一样在水中驱动,而液力变矩器则是通过泵轮.涡轮.导轮三组叶片.液力变矩器最大的特点在

资源到底是什么?Menu到底是什么?Function到底是什么?

Menu是什么? Menu表示空间坐标,是个标识符和定位符融为一体的对象.如果我们的系统是棵树,Menu实际上就是用来指示树上的具体位置.用户通过Menu来告诉系统他/她想要到这棵树上的哪个节点中去.Menu用来指示静态的资源树上的节点,资源树上的节点是空间.是场所. 而Function是动态的,是动态的运动树(栈)上的节点. 将Menu重命名为SpaceId可能更合适?需要是标识符不能是定位符,SpaceId对象上具有个url(定位符).标识符和定位符的差别就是要翻译.我们无法保证系统树的结构

JavaScript 之 解码类似eval(function(p,a,c,k,e,d){}))的JavaScript代码

这里以解码百度访问统计代码构造函数为示例: 以下为要统计JavaScript源码:红色加粗部分将是要修改的地方. eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e

new Function和eval区别

eval和new Function都可以动态解析和执行字符串.但是它们对解析内容的运行环境判定不同. eval中的代码执行时的作用域为当前作用域.它可以访问到函数中的局部变量. new Function中的代码执行时的作用域为全局作用域,不论它的在哪个地方调用的.所以它访问的是全局变量a.它根本无法访问b函数内的局部变量. 下面这个例子可以说明了: var a = 'global scope' function b(){ var a = 'local scope' eval('console.l