如何在Javascript中保护全局范围

时间:2012-01-09 07:02:36

标签: javascript function methods private anonymous

原始问题:

我正在研究js,我想知道这两种保护全局范围的方法之间是否存在任何(有用)差异,而不是第二种方法可以重复使用(再次调用)。

选项1:

var question = {};
(function(){ 
    question.option1 = function() {
        // some code
    };
})();

选项2:

var question = {};
question.option2 = function () {
    //some code
};
question.option();

谢谢!

编辑1:

谢谢@luisperezphd。你写的和这个(除了冗长)之间有什么区别吗?

var question = {};
question.option3 = {};
question.option3.privateVar = 0;
question.option3.testing = function () {
    question.option3.privateVar++;
    // some code
};
question.option3.testing();

编辑2:

谢谢lanston和luisperezphd!我没有意识到这个问题.option3.privateVar在全球范围内可用。

这有什么区别:

var question = {};
(function(){
    var privateVar = "some value";
    question.option4 = function(){
        alert(privateVar);
    }
})();
question.option4();

和此:

var question = {};
question.option5 = function() {
    var privateVar = "some value";
    var someFunction = function() { 
        alert(privateVar);
    }
    return someFunction;
}
question.option5()();

2 个答案:

答案 0 :(得分:4)

您给出的示例没有区别,但是您没有被利用的差异。在第一个示例中,您可以使用变量,而不是污染全局命名空间或对象命名空间。大多数面向对象语言中的私有字段的等价物。你会这样做:

var question = {};
(function(){ 
    var PrivateVariable = 0;
    question.option1 = function() {
        PrivateVariable++;
        // some code
    };
})();

alert(question.PrivateVariable); // returns 'undefined'

上述代码返回undefined的原因是因为PrivateVariable不是question中的字段。但question中的功能可以访问PrivateVariable。这确实是一个私有变量。

另一方面,如果你这样写:

var question = {};
question.PrivateVariable = 0;
question.option1 = function() {
    question.PrivateVariable++;
    // some code
};

alert(question.PrivateVariable); // returns 0

在第二种情况下,PrivateVariable实际上并非私有且可公开访问。

顺便提一下,您通常不会从属于您问题的函数中引用question。相反,您可以使用this关键字,如下所示:

var question = {};
question.PrivateVariable = 0;
question.option1 = function() {
    this.PrivateVariable++;
    // some code
};

但这只适用于公共变量。它使得更清楚的是发生了什么。此外,在某些情况下,它使维护代码更容易,因为如果您从question更改变量的名称,则不必在函数内更改对它的引用。还有其他好处,但我不知道我是否应该进入这里。

答案 1 :(得分:0)

@ svdsvd,liusperezphd和你的PrivateVariable之间有很大不同,你无法在全球范围内获得它,但你可以在全球范围内获得question.option3.privateVar