首頁 >web前端 >js教程 >關於eval 與new Function 到底該選哪個?_基礎知識

關於eval 與new Function 到底該選哪個?_基礎知識

WBOY
WBOY原創
2016-05-16 17:36:531090瀏覽

廢話不多說,直接上測試程式碼

複製程式碼


程式碼如下:


var aa = "{name:'cola',item:[{age:11},{age:22},{age:23},{age:23}]}";
var now = new Date().getTime();
    for (var i = 0; i         var a = eval("(" aa ")")     }
    var now1 = new Date().getTime();
    document.write("eval 時間為:" (now1 - now) "
");
    var now2 = new Date().getTime();
    for (var i = 0; i     fn();
    }
    var now3 = new Date().getTime();
    document.write("new Function時間為:" (now3 - now2) "
");

        //經過測試結果FF效果如下
        //eval 時間為:979
      //eval 時間為:979
      //eval 時間為:979    

        //經過測試結果 IE8效果如下
        //eval 時間為:913
      

        //經過測試結果 Chrome效果如下

        //eval 時間為:211
        //new Function時間為時為:251

        //經測試結果 Opera

        //eval 時間為:384
        //new Function時間為
        //new Function時間為時為

        //new Function時間為時為1024

測試結果為不同瀏覽器測試的參考資料,覺得奇怪的是為什麼每個瀏覽器測試的時候都是eval要快點,我們是不是要採用他呢?


親,先不要急, 接下往下看,帶著這些疑問,好奇心的我終於展開了另外一個測試,這時候我做一個動態涵數來分別讓eval 和new Function 來執行再看看效果

程式碼如下:


var testEval = ftion


         return eval('0, ' obj '');
       //return eval('('( 'obj ')')
      var testFun = function (obj) {
          var fn = new Function(" );   };

      var now = new Date()。 ,從來不騎.........'); }");
          fn();
      }
      var now1 = getnew Date). document.write("
");
      document.write("eval 時間為:" (now1 - now) "
");
   ).getTime();
      for (var i = 0; i           testFun("document.write('我有一頭小毛驢,從來  ...');");
      }
      var now3 = new Date().getTime();
      document.write("new Function 時間為:      document.write("new Function.write" />");


  //經過測試結果 FF效果如下
        //eval 時間為:495
        //new Function時間為:50

        //經過測試結果 IE8效果如下
        //eval 時間為:34
        //new Ftion時間為:0.

        //經過測試結果 Chrome效果如下

        //eval 時間為:7
        //new Function時間為:3
        //new Function時間為:4

時間為: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 來代替。 如果有理解的不太對的地方,請大家指正,歡迎拍磚。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn