Это хороший способ обернуть переменные Javascript? - PullRequest
3 голосов
/ 03 августа 2011

Я искал этот пост Завершение глобальных переменных javascript ,

var Global_VARS = {
productId:10,
itemId:20,
commentId:30,
ratingId:20
}

Это хороший способ записи переменных JavaScript?

Ответы [ 5 ]

4 голосов
/ 03 августа 2011

Общее правило, которое вы всегда должны соблюдать, - не загромождать глобальное пространство имен глобальными переменными.

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

Иметь их внутри анонимной функции также хорошо, внутри функции вы можете иметь столько переменных, сколько захотите, они не будут доступны извне. Затем вы можете выбрать, какой из них будет доступен снаружи.

2 голосов
/ 03 августа 2011

Заключение всех общих глобальных переменных в пространство имен - это 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 они всегда будут глобально доступны, но если они были определены в промежуточной области, их необходимо будет вручную передать в самую внутреннюю область).
1 голос
/ 03 августа 2011

, если вы хотите полностью обернуть их, определите их в анонимной функции (а также в остальной части вашего кода) и вызовите ее

(function(){
  var x = ..., ... ...;
  // do stuff
})();
1 голос
/ 03 августа 2011

Да, именно так вы и делаете, если вам нужен только один экземпляр объекта. Думайте об этом как о пространстве имен.

1 голос
/ 03 августа 2011

Конечно, но вы также можете написать:

var productId = 10,
    itemId = 20,
    commentId = 30,
    ratingId = 20;

Таким образом, вам не нужно делать Global_VARS.productId, вы можете просто использовать productId

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...