是否可以将所有变量分配给对象以避免创建全局变量?

时间:2015-04-03 00:36:57

标签: javascript jquery

1.例如,如果我在声明变量之前定义了一个对象,那么将它们称为对象的一部分,如下所示......

//Global object
var Global = [];

//Every var thereafter ...
Global.variable1 = some value;
Global.variable2 = some value;
Global.variable3 = some value;**

2 个答案:

答案 0 :(得分:1)

是的,这称为namespacing。它创建一个单一的全局(它应该具有比您正在使用的更独特的名称),然后将所有全局状态作为属性放在该单个全局上。

这是一个很好用和推荐的做法,由jQuery等库使用,它们被设计为与许多其他代码(可能有自己的全局变量)兼容。这种做法限制了你自己的全局变量的使用,这减少了与其他代码发生冲突的可能性。

您通常会将单个全局变为Object,而不是像这样的数组:

var myGlobal = {};
myGlobal.prop1 = "whatever";

通过使用闭包来封装代码和状态,还有其他方法可以限制多少变量必须真正全局化。这是您提出的namespacing的替代技术。

它的工作原理如下:

(function() {
    var variable1 = some value;
    var variable2 = some value;
    var variable3 = some value;

    // all your code here that uses variable1, variable2 and variable3
})();

这些变量实际上是立即调用的函数表达式的局部变量(缩写为IIFE,它实际上只是一个匿名函数,为创建具有私有变量的函数作用域而立即执行)。

因为所有代码都在相同的函数范围内,所以它们的代码类似于全局代码而不是实际的全局代码。其他代码不能与这些变量冲突或访问这些变量,因此它也可以实现隐私。

答案 1 :(得分:0)

这是人们使用立即调用函数表达式(IIFE)的原因之一。通过将代码放在一个自称调用的匿名函数中,您不必担心会污染全局命名空间的变量。

它看起来像这样:

(function() {
    var variable1 = 'some value'; // This variable is not global
    var variable2 = 'some value'; // This variable is not global
    var variable3 = 'some value'; // This variable is not global
})();