2014-09-03 5 views
-1

В моем проекте я использую язык JavaScript, который является объектом, а все языковые ключи - это свойства этого объекта, например. o_language['name'] = 'Name' next У меня есть одиночные файлы .js, где каждый из них представляет собой один объект, содержащий все функции для одного представления PHP, например.Производительность JavaScript - глобальные переменные

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

В loader.js я загружаю все необходимые объекты, а затем я знаю, что я могу назвать язык несколькими различными способами, но я не понимаю, что самый быстрый и почему.

1-й метод - я могу использовать глобальный o_language прямо, например.

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

2-й метод - я могу использовать глобальный o_language, присвоенный объекту, например.

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

3-й метод - я могу использовать глобальный o_language, присвоенный объекту, и создавать функцию var eg.g.

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

4-й метод - я могу использовать глобальный o_language, присвоенный переменной функции, например.

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

EDIT: возможно, я попытаюсь объяснить это лучше. Теоретическая ситуация:

<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'. Вы назначаете свойство lang из свойства 'o_language ['name']', если это свойство не возвращает объект так, как вы его используете, это неправильно. В противном случае игнорировать меня –

+1

Существует не быстрый способ ... но прямые вызовы свойств, я думаю, будет. 'this.object.property' над' this.object ['property'] ' –

+1

Вы действительно делаете это миллионы раз? Если нет, это не будет иметь большого значения - прекратите преждевременно оптимизировать. Например, тест производительности доступа к ресурсам здесь получил 1 154 538 876 запросов в секунду. [Dot значительно быстрее в некоторых браузерах, '['']' немного быстрее на других] (http://jsperf.com/testaccessobjectnotation/2). –

ответ

2

Как упоминалось выше, в JavaScript нет самого быстрого доступа к свойствам объекта (. Vs ['']), поскольку это в значительной степени зависит от платформы.

Также обратите внимание, что ваши 4 метода вряд ли сопоставимы, потому что методы 2, 3 и 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 Фалькон, вы не увидите каких-либо различий в производительности между этими 4 способами, если вы звоните своим метод миллионы раз. И даже тогда разница будет незаметной.

Из-за этого вопроса единственное, что вы должны учитывать при принятии решения, это качество кода.

Если вам нужно, чтобы дополнительное имущество или дополнительная информация для вашего кода были более понятными и поддерживаемыми, для вас или для других, сделайте это.

Также имейте в виду, что существует множество ситуаций, когда объявление дополнительной переменной или выполнение 3 операций вместо 1 улучшает читаемость кода, а иногда и производительность, поэтому не бойтесь делать это, когда думаете, что это поможет ,

Для примера, в частности, я бы с первым способом, если o_language['name'] доступен только один или два раза в do_something, но я бы с четвертым способом, если o_language['name'] доступом несколько раз внутри do_something, потому что для меня его легче читать, и если вам когда-нибудь понадобится переименовать o_language['name'], тогда вам нужно будет изменить только в одном месте (var o_lang = o_language['name']) вместо 3 или более, поэтому его проще в обслуживании (при условии, что вы не хотите использовать Find & Заменить или какой-то усовершенствованный инструмент рефакторинга).

Кроме того, если вам комфортно назначать какое-либо глобальное свойство объекта для свойства локального объекта, сделайте это. Я делаю это, например, когда у меня есть глобальный объект Configuration, который имеет разные свойства для разных модулей/компонентов, а затем каждый объект модуля/компонента может иметь собственное свойство конфигурации, взятое из глобального объекта.

Но все же это скорее вопрос вкуса, чем рекомендация.

Смежные вопросы