原始问题:
我正在研究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()();
答案 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