關於eval 與new Function 到底該選哪個?

來源:互聯網
上載者:User

廢話不多說,直接上測試代碼
複製代碼 代碼如下:
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 來代替。 如果有理解的不太對的地方,請大家指正,歡迎拍磚。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.