eval 및 new Function에 대해 어떤 것을 선택해야 합니까?

3394 단어 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에서 실행하도록 하는 것은 매우 느리고 다른 브라우저의 차이가 크지 않다면 우리는 리턴 eval('0,'+obj+')을 너무 많이 추궁할 필요가 없다.아마 여러분은 여기 0이 무슨 뜻이라고 생각하실 거예요. 0을 더하면 모든 브라우저를 겸용할 거예요. 안 넣으면 IE9 이하 버전이 틀릴 거예요. 그런데 진짜 0의 뜻을 어떻게 분석해야 할지 모르겠어요. 이걸 더하면 징그러운 IE가 겸용할 수 없다는 걸 알 뿐이에요. 위의 두 밤을 통해 JSON꼬치의 전환을 위해서라면 EVAl이 분명히 빠를 거예요.동적 함수 해석이라면 new Function이 빨라야 한다. 여기서 두 가지 우열을 말한다. 그리고 eval 호환성이 좋지 않다. 해석이 잘못되면 다른 JS 스크립트가 실행되지 않을 수도 있고 후자는 그렇지 않을 수도 있다. 그는 이 Function에 대해 내가 너무 번거로운 일을 좋아하지 않기 때문에 eval을 과감하게 포기하고 new Function으로 대체한다.이해가 잘 안 되는 부분이 있다면 지적해 주시고 벽돌을 두드리는 것을 환영합니다.

좋은 웹페이지 즐겨찾기