这是一个包装Javascript变量的好方法吗?

时间:2011-08-03 18:20:26

标签: javascript design-patterns

我期待这篇文章Wrap up javascript global variables

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

这是编写JavaScript变量的好方法吗?

5 个答案:

答案 0 :(得分:4)

您应该遵循的一般规则是不要使用全局变量来混淆Global命名空间。

所以你应该保持全局​​变量尽可能低,以避免混乱。将所有变量分组到一个唯一对象中是一个好主意,而不是将它们全局化。

将它们置于一个无穷大的函数中也很好,在一个函数中你可以拥有任意数量的变量,它们在外部是不可用的。然后你可以选择哪一个可以在外面使用。

答案 1 :(得分:2)

将所有常见的全局变量包含在命名空间中是一个好主意的 start 。然而,作者试图解决的问题是一个更大的问题 - 适当的封装问题。有几种不同的方法可以将它们组合成许多不同的模式。

这些模式中的每一个都启用或禁用了一些东西:

  • 变量阴影:我是否可以更新特定上下文中的特定变量,而不更新变量“global”(即在所有可访问该变量的范围内) ?
  • 全球可访问:我可以从代码中的任何其他范围到达该变量的吗?

首先是这里已经提到的包含对象模式:

// `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可访问的每个范围内更新。{ / LI>
  • 全球可访问: 是。在每个可以访问全局对象的范围内(这是每个范围,具有单独加载的代码的异常(我相信))像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上,它们将始终可全局访问,但如果它们已在中间范围内定义,则需要手动将它们传递到最内层范围。)

答案 2 :(得分:1)

当然,但你也可以写:

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

这样您就不必Global_VARS.productId,只需使用productId

答案 3 :(得分:1)

是的,如果你只需要一个对象的实例,那就是你如何做到的。可以把它想象成命名空间。

答案 4 :(得分:1)

如果你想完全包装它们,可以在匿名函数(以​​及代码的其余部分)中定义它们并将其命名为

(function(){
  var x = ..., ... ...;
  // do stuff
})();