Заключение всех общих глобальных переменных в пространство имен - это start хорошей идеи. Однако проблема, которую автор пытается решить, гораздо шире - проблема правильной инкапсуляции. Есть несколько различных подходов к этому, которые могут быть объединены во множество различных шаблонов.
Каждый из этих шаблонов включает или отключает вещи:
- Затенение переменной: Могу ли я обновить определенную переменную в определенном контексте без обновления переменной «глобально» (т. Е. Во всех областях, в которых эта переменная доступна)?
- Доступно глобально: Можно ли получить значение этой переменной из любой другой области видимости в коде?
Во-первых, шаблон уже содержащегося объекта, уже упомянутый здесь:
// `root_reference` is pseudo-code for `window` or `this`.
root_reference.GLOBAL_VARIABLES = {
variable1: 1,
variable2: 2,
variable3: {data: 1, point: 2}
// etc ...
}
- Затенение переменной: Нет. Если вы обновляете
GLOBAL_VARIABLES.variable1
в одном месте, оно обновляется во всех областях, в которых GLOBAL_VARIABLES
доступно.
- Доступно глобально: Да. В каждой области, которая имеет доступ к глобальному объекту (который является каждой областью, за исключением (я полагаю) одиночного кода, загружаемого модулем). загрузчик, такой как node.js или Require.js) Я могу достичь
root_reference.GLOBAL_VARIABLES.variable1
.
Преимущество этого шаблона в том, что вы можете легко получить доступ к переменной практически из любого места в вашем коде. Недостаток этого шаблона в том, что вы можете обновлять эту переменную легко практически из любой точки вашего кода, но вы не можете рассчитывать на откат в любом месте .
Второй шаблон - это шаблон объема, который использует var
:
var variable1 = 1, variable2 = 2, variable3 = {data: 1, point: 2};
function display_vars(one, two, three) {
console.log("Variable 1", one);
console.log("Variable 2", two);
console.log("Variable 3", three);
}
display_vars(variable1, variable2, variable3) // 1, 2, {data: 1, point: 2}
// Immediately Executed Function Expression
(function(old_var_1, old_var_2, old_var_3){
var var variable1 = 12, variable2 = 21, variable3 = {data: 11, point: 21};
// We have now shadowed the variables in this scope:
display_vars(variable1, variable2, variable3) // 12, 21, {data: 11, point: 21}
// But we also have access to the old ones:
console.log(old_var_1, old_var_2, old_var_3);
})(variable1, variable2, variable3);
// And they are unchanged outside of the new scope
display_vars(variable1, variable2, variable3) // 1, 2, {data: 1, point: 2}
- Переменная затенения: Да.
- Доступно глобально: Нет. Вам необходимо вручную передать ссылки на переменные из внешней области видимости, чтобы быть уверенными в том, что они имеют к ним доступ (если переменные были определены в
root_reference
они всегда будут глобально доступны, но если они были определены в промежуточной области, их необходимо будет вручную передать в самую внутреннюю область).