2014-09-03 2 views
-1

내 프로젝트에서 자바 스크립트 언어 파일을 사용하고 있으며 모든 언어 키는이 객체 속성입니다. o_language['name'] = 'Name' 다음 하나의 .js 파일을 가지고 있는데, 각 파일은 단일 PHP보기에 대한 모든 기능을 포함하는 단일 개체입니다. loader.js에서자바 스크립트 성능 - 전역 변수

o_add_card = { 
    init: function(){...}, 
    do_something: function(){..}, 
    do_something_2: function(){..} 
} 

내가 필요한 모든 오브젝트를로드하고있어, 다음, 나는 몇 가지 다른 방법으로 언어를 호출 할 수 있지만 내가 가장 빠르고 이유 다 이해하지 못하는 것을 알고있다.

첫 번째 방법 - 글로벌 o_language를 사용할 수 있습니다. 예 :

o_add_card = { 
    init: function(){...}, 
    do_something: function(){ 
     alert(o_language['name']); 
    }, 
} 

두 번째 방법 - 객체 속성에 할당 된 전역 o_language를 사용할 수 있습니다.

세 번째 방법 - 개체 속성에 할당 된 전역 o_language를 사용하여 함수 var를 만들 수 있습니다.

o_add_card = { 
    lang: o_language['name'], 
    init: function(){...}, 
    do_something: function(){ 
     var o_lang = this.lang; 
     alert(o_lang ['name']); 
    }, 
} 

네 번째 방법 - 전역 변수 o_language를 변수에 할당 할 수 있습니다. 예 :

o_add_card = { 
    init: function(){...}, 
    do_something: function(){ 
     var o_lang = o_language['name']; 
     alert(o_lang ['name']); 
    }, 
} 

편집 : 아마도 내가 더 잘 설명하려고합니다. 이론적 상황 :

<script> 
    global_o_language = { 
     name: 'name', 
     //... (approx 500 other properties) 
    } 
    global_o_add_card: { 
     lang: global_o_language, 
     init: function(){ 
      this.function_1(); 
      // ... other functions coming here 
     }, 
     function_1: function(){ 
      var o_lang = this.lang; 

      // I don't care about using dot or brackets here, but about using global or local var's 
      // I can use global variable straight 
      alert(global_o_language['name']); 

      // I can load global variable to object property and use it like that 
      alert(this.lang['name']); 

      //or create local variable inside function where I assign global one or `this` property 
      alert(o_lang['name']); 
     } 
    } 
    global_o_add_card.init(); 
</script> 

나는 어떤 방법이 더 나은지 알고 싶습니다.

+0

당신이 묻는 것이 확실하지 않지만 속성을 설정할 때 : lang : o_language [ 'name']'그러면이 속성을 사용합니다. 이것은 틀린'this.lang [ 'name']', 이것은 'this.lang'을 수정하십시오. 'o_language [ 'name']'속성에서 lang 속성을 지정합니다. 단, 그 속성이 잘못 사용하는 방식으로 객체를 반환하지 않는 한. 그렇지 않으면 나를 무시하십시오 –

+1

가장 빠른 방법은 없지만 직접적인 속성 호출이 될 것 같습니다. 'this.object.property' over this.object [ 'property']' –

+1

정말 수백만 번하고 있습니까? 그렇지 않다면,별로 중요하지 않을 것입니다. 성급하게 최적화를 중단하십시오. 예를 들어, 여기에 대한 속성 액세스 성능 테스트에서는 초당 1,154,538,876 개의 액세스가있었습니다. [일부 브라우저에서는 점이 현저히 빠르며 다른 사람들은 약간 더 빠릅니다] (http://jsperf.com/testaccessobjectnotation/2). –

답변

2

여기에 언급 된 다른 것들은 JavaScript에서 객체 속성 (.vs [ ''])에 액세스하는 가장 빠른 방법이 없기 때문에 주로 플랫폼에 의존합니다.

또한 방법 2, 3 및 4는 첫 번째 방법의보다 복잡한 버전이기 때문에 4 가지 방법이 거의 비교할 수 없으므로 어떤 것이 가장 빠른 것 (적어도 이론적으로)인지 알고 싶다면 대답은 첫 번째 것입니다.

// 1 operation 
o_add_card = { 
    init: function(){...}, 
    do_something: function(){ 
     alert(o_language['name']); // 1 operation - read property from global object 
    }, 
} 

// 3 operations + 1 extra object property 
o_add_card = { 
    lang: o_language['name'], // 2 operations - read property from global object 
          //    - assign it to local property 
          // + 1 extra property to store for the current object 
    init: function(){...}, 
    do_something: function(){ 
     alert(this.lang['name']); // 1 operation - read property from local object 
    }, 
} 

// 5 operations + 1 extra property + 1 extra variable 
o_add_card = { 
    lang: o_language['name'], // 2 operations - read property from global object 
          //    - assign it to local property 
          // 1 more property to store for the current object 
    init: function(){...}, 
    do_something: function(){ 
     var o_lang = this.lang; // 2 operations - same as above + the extra variable 
     alert(o_lang ['name']); // 1 operation - read property from global object 
    }, 
} 

// 3 operations + 1 extra variable 
o_add_card = { 
    init: function(){...}, 
    do_something: function(){ 
     var o_lang = o_language['name']; // 2 operations - same as above + the extra variable 
     alert(o_lang ['name']); // 1 operation - read property from global object 
    }, 
} 

Dark Falcon이 말했듯이, 네 가지 방법을 수백만 번 호출하지 않으면 성능 차이가 나타나지 않습니다. 그리고 그때조차 차이는 눈에 띄지 않을 것입니다.

이 문제로 인해 결정할 때 고려해야 할 유일한 사항은 코드 품질입니다.

추가 속성이나 추가 변수가 있어야 이해하기 쉽고 유지 관리하기가 쉬워집니다.

추가 변수를 선언하거나 1 대신 3 가지 연산을 실행하면 코드 가독성이 향상되고 때로는 성능도 향상된다는 수많은 상황이 있으므로 이점에 대해 생각할 때 두려워하지 마십시오. .o_language['name']는 한 번 또는 두 번 do_something 내부에 액세스 할 경우, 특히 귀하의 예를 들어

, 나는 첫 번째 방법으로 가고 싶어하지만, o_language['name']do_something 내부에 여러 번 액세스 할 경우 나는 네 번째 방법으로 갈 것 나를 위해 때문에 읽기가 쉽습니다. o_language['name']의 이름을 변경해야하는 경우 3 개가 아닌 단일 장소 (var o_lang = o_language['name']) 만 수정해야하므로 유지 관리가 더 쉽습니다 (찾기를 사용하지 않으려는 경우 & 바꾸기 또는 일부 고급 리팩토링 도구).

또한 글로벌 개체 속성을 로컬 개체 속성에 할당하는 것이 편하다고 생각하면 그렇게하십시오. 예를 들어 글로벌 Configuration 오브젝트가 있는데, 다른 모듈/컴포넌트에 대해 다른 특성을 가지고 있으며, 각 모듈/컴포넌트 오브젝트는 글로벌 오브젝트에서 가져온 자체 구성 특성을 가질 수 있습니다.

하지만 여전히 권장 사항보다 맛이 좋습니다.

관련 문제