Работа с голямо количество глобални променливи в JavaScript

Имам приложение на JavaScript, което използва голямо количество глобални променливи (като например, няколкостотин от тях - това е порт на C програма, така че не го написах така). Очевидно това е много лоша практика да има толкова много променливи в обекта Window, но се боря да измисля безсловен начин да направя това.
В момента мисля, че това е пътят напред:

var myApp = {};

//file1.js:
myApp.variables = (function() {
    var var1, var2, var3;
    var items = new exampleConstructorFunction();
    var etcereta = [];
})();

//file2.js:
myApp.gameplay = (function() {
    //gameplay code
})();

//file3.js:
myApp.scheduling = (function() {
    //timing code
})();

Но проблемът е, че за да имате достъп до която и да е от променливите в myApp.variables от функции, дефинирани в gameplay или timing, ще трябва да я посочите като myApp.variables.var1, което е доста лошо за четливостта, когато трябва да ги използвате често. Някакъв съвет?


person Magg G.    schedule 10.05.2014    source източник


Отговори (3)


проблемът изглежда определено свързан с postid, току-що опитах друг postid от вашата стена 100002510712421_202158336544522 и получих резултати. публичен ли беше този postid или ограничен до приятелите ви?
person Community    schedule 10.05.2014
comment
Това звучи като добро решение. Единственият проблем, който бих видял, е ако искате да поддържате пространство от имена, за да предпазите стотиците глобални променливи от конфликт с тези, които декларирате във функцията. - person dan_paul; 11.05.2014
comment
@dan_paul—този проблем вече съществува (и вероятно е преодолян), използването на IIFE не го влошава. Той просто премества проблема от глобален към функционален контекст, което OP иска. - person RobG; 11.05.2014
comment
това обаче би ги направило свойства на обекта myApp, нали? доколкото знам, свойствата на обекта нямат достъп до други свойства на обекта (може ли да греша за това?). Мислех да комбинирам целия скрипт, но той е доста голям (така че отстраняването на грешки няма да е забавно) и разделя много добре, така че просто изглежда по-изчистено, за да ги запази в пространството на имената - person Magg G.; 11.05.2014
comment
@jqueryrocks Съгласен. Как да избягвам глобалните променливи в JavaScript? - person Joel Allison; 11.05.2014
comment
@jqueryrocs - това има смисъл. Отговарях на първата част от вашето предложение (съхраняване на глобалните данни директно в myApp). Ако не се нуждаете от обекта myApp, тогава IIFE определено ще избегне глобалното замърсяване на пространството от имена. Предполагам, че OP може да се нуждае от този обект (изглежда, че може да използват рамка). - person dan_paul; 11.05.2014
comment
@dan_paul Да, това има смисъл, ако той се нуждае от обекта - person ; 11.05.2014
comment
@dan_paul Не ми трябва обектът. Искам да имам геймплей, график и т.н. (те са в отделни файлове, между другото) да имам достъп до всички глобални променливи, без да се налага да комбинирам всичко в един огромен скриптов файл. Това е всичко - person Magg G.; 11.05.2014

Ако просто сте загрижени за дължината на името на променливата, не можете ли просто да дефинирате препратка към нея в локален обхват?

var v = myApp.variables;
person dan_paul    schedule 10.05.2014
comment
но тогава за всяка променлива пак ще трябва да напишете v.varname, а не само varname - person Magg G.; 11.05.2014
comment
Да, но запазвате пространство от имена. По този начин, ако случайно декларирате var varname = 'foo'; във вашата функция, това няма да е в конфликт с v.varname. Наистина зависи от случая на употреба, предполагам. - person dan_paul; 11.05.2014
comment
но.. ако името на променливата е предназначено да бъде глобално на първо място, няма ли да е правилното поведение за деклариране на име на променлива отново? - person Magg G.; 11.05.2014
comment
Не съм сигурен, че ви следвам на 100%. Мисля, че ако нямате нужда от обекта myApp, трябва да отидете с отговор @jquerrrocks, за да използвате IIFE. Ще разполагате с всичките си глобални променливи, без да се налага да замърсявате пространството на глобалните променливи. Току-що прочетох това, за да науча: benalman.com/news /2010/11/ - person dan_paul; 11.05.2014

Използвам ASP, Windows сървър, MS SQL DB, но това може да се направи и в PHP, Linux-базирани сървъри, MySQL DB. Ще трябва да създадете една или повече DB, след това да напишете ASP скрипт (или PHP скрипт), за да съхранявате стойностите на вашите променливи в DB, ​​след което (отново с помощта на ASP/PHP скрипт) да ги извикате/използвате. Не е лесна задача за писане на скрипт, но има много примери, налични в ASP (PHP форуми), които могат да бъдат адаптирани. Веднъж скриптиран и съхранен в DB от страна на сървъра, след това достъпен за повторна употреба, ревизия. Може да съдържа много полета с данни и стойности. HTH

person saratogacoach    schedule 10.05.2014