Работа с большим количеством глобальных переменных в 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)


Вы можете просто сохранить свои текущие глобальные переменные непосредственно в myApp, или вы можете избежать этого подхода и обернуть весь сценарий в анонимную функцию и выполнить ее - например, (function() { })(), тогда вам не нужно создавать пространство имен для ваших переменных, чтобы они не попадали в глобальную область.

person Community    schedule 10.05.2014
comment
Это звучит как хорошее решение. Единственная проблема, которую я вижу, это если вы хотите поддерживать пространство имен, чтобы сотни глобальных переменных не конфликтовали с теми, которые вы объявляете в функции. - person dan_paul; 11.05.2014
comment
@dan_paul - эта проблема уже существует (и, по-видимому, решена), использование IIFE не делает ее хуже. Он просто перемещает проблему из глобального контекста в контекст функции, чего и хочет ОП. - 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 определенно позволит избежать загрязнения глобального пространства имен. Я предполагаю, что ОП может понадобиться этот объект (похоже, они могут использовать фреймворк). - 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
но .. если varname в первую очередь предназначено быть глобальным, не будет ли это правильным поведением для повторного объявления varname? - 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, но это также можно сделать в PHP, серверах на базе Linux, БД MySQL. Вам нужно будет создать одну или несколько БД, затем написать сценарий ASP (или сценарий PHP) для хранения значений ваших переменных в БД, а затем (опять же с использованием сценария ASP/PHP) вызвать/использовать их. Непростая задача написания сценария, но в ASP (на форумах PHP) доступно множество примеров, которые можно адаптировать. После написания сценария и сохранения в БД на стороне сервера, а затем доступны для повторного использования, пересмотра. Может содержать множество полей данных и значений. ХТН

person saratogacoach    schedule 10.05.2014