这是封装Javascript变量的好方法吗?

这是封装Javascript变量的好方法吗?,javascript,design-patterns,Javascript,Design Patterns,我在找这个帖子 这是编写JavaScript变量的好方法吗?当然可以,但您也可以编写: var productId = 10, itemId = 20, commentId = 30, ratingId = 20; 这样,您就不必执行Global\u VARS.productId,只需使用productId是的,如果您只需要一个对象实例,就可以这样做。将其视为一个名称空间。您应该始终遵循的一般规则是不要用全局变量将全局名称空间弄乱 因此,您应该尽可能降低全局变量以避免混

我在找这个帖子


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

当然可以,但您也可以编写:

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

这样,您就不必执行
Global\u VARS.productId
,只需使用
productId

是的,如果您只需要一个对象实例,就可以这样做。将其视为一个名称空间。

您应该始终遵循的一般规则是不要用全局变量将全局名称空间弄乱

因此,您应该尽可能降低全局变量以避免混乱。将所有变量分组到一个唯一的对象中是一个好主意,而不是让它们成为全局变量


将它们放在一个匿名函数中也是很好的,在一个函数中,你可以有你想要的任意多的变量,它们在外部是不可用的。然后,您可以选择哪一个对外部可用。

如果您想完全包装它们,请在匿名函数中定义它们(以及其他代码)并调用它

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

将所有通用全局变量封装在名称空间中是一个好主意的开始。然而,作者试图解决的问题是一个更大的问题——适当的封装。有几种不同的方法可以实现这一点,它们可以组合成许多不同的模式

这些模式中的每一种都启用或禁用以下内容:

  • 变量阴影:我是否可以在特定上下文中更新特定变量,而不“全局”更新变量(即,在该变量可访问的所有范围内)
  • 全局可访问性:我可以从代码中的任何其他作用域获得该变量的值吗
首先是这里已经提到的包含对象模式:

// `root_reference` is pseudo-code for `window` or `this`.
root_reference.GLOBAL_VARIABLES = {
    variable1: 1,
    variable2: 2,
    variable3: {data: 1, point: 2}
    // etc ...
}
  • 变量阴影:否。如果您在一个位置更新
    全局变量。variable1
    在可访问
    全局变量的每个范围内更新
  • 全球可访问:是。在可以访问全局对象的每个作用域(即每个作用域,除了node.js或Require.js等模块加载器加载的代码(我相信)之外)中,我可以访问
    root\u reference.global\u 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\u引用中定义,则始终可以全局访问,但如果变量已在中间范围中定义,则需要手动将其传递到最内层范围)

是的,但我常常忘记了什么时候有很多行代码。你不想有太多全局变量。这可能会变得混乱。因此我认为将全局变量包装在容器中是一种好方法。或者甚至
window.productId
如果它们是在最顶层声明的,最好使用名称空间来包装你的代码vars@mykhal因为如果使用d在函数中它不会感染整个全局范围在匿名函数中包装变量将限制变量在其声明的内部范围。如果我想在页面外部使用它,该怎么办。@Khan:您必须定义一个全局变量,它将接收包含局部变量的对象。这就是JS库的工作方式,它们只是公开一个包含所有变量和方法的对象(无论是jQuery还是YUI等)。@Khan123如果您想防止与第三方代码冲突,它很有用。如果您想“从外部”访问变量,我同意这不是最好的解决方案)顺便说一句,如果有全局第三方变量,这没有问题(如果是这样的话,您不需要)称为x,因为它是阴影…所以,如果您正在编写一段代码,它很有用。如果您正在编写一个库,请创建一个包含所需函数的全局对象,正如Jose所说。简短的回答是肯定的。您还需要学习JavaScript中的闭包和函数。
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}