原始问题:
我正在研究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()();
?
解决方法:
您提供的示例没有什么区别,但是您尚未利用的区别也没有.在第一个示例中,您可以利用变量而不污染全局名称空间或对象名称空间.等同于大多数面向对象的语言中的私有字段.您将这样做:
var question = {};
(function(){
var PrivateVariable = 0;
question.option1 = function() {
PrivateVariable++;
// some code
};
})();
alert(question.PrivateVariable); // returns 'undefined'
上面的代码返回未定义的原因是因为PrivateVariable不是所讨论的字段.但是有问题的函数可以访问PrivateVariable.这确实是一个私有变量.
另一方面,如果您这样写:
var question = {};
question.PrivateVariable = 0;
question.option1 = function() {
question.PrivateVariable++;
// some code
};
alert(question.PrivateVariable); // returns 0
在第二种情况下,PrivateVariable实际上不是私有的,并且不能公开访问.
顺便说一句,您通常不会从属于您的问题的函数内部引用问题.相反,您将使用this关键字,如下所示:
var question = {};
question.PrivateVariable = 0;
question.option1 = function() {
this.PrivateVariable++;
// some code
};
但这仅适用于公共变量.它使事情更加清楚.同样,在某些情况下,这使得维护代码更加容易,因为如果您从问题中更改变量的名称,则无需在函数内部更改对其的引用.还有其他好处,但是我不知道是否应该在这里讨论.