以下两种模式是否有任何区别?自行执行第一个有什么好处?
var testModule = (function () {
var counter = 0;
return {
incrementCounter: function () {
return counter++;
},
resetCounter: function () {
console.log( "counter value prior to reset: " + counter );
counter = 0;
}
};
})();
testModule.incrementCounter(); // 1
下一步:
var testModule2 = function () {
var counter = 0;
return {
incrementCounter: function () {
return counter++;
},
resetCounter: function () {
console.log( "counter value prior to reset: " + counter );
counter = 0;
}
}
}
var result = testModule2();
result.incrementCounter(); //1
答案 0 :(得分:4)
第一个是单例 - 你可以克隆它,当然,但它会非常尴尬,首先,并且不会复制那些私有变量:所有克隆对象的所有方法仍然可以工作使用相同的var counter
。这就是为什么它适合制作类似服务的东西。
第二个实际上是构造函数的变体 - 它适合基于单个模板创建多个东西。它的缺点(与经典的基于prototype
的模板相比)是每次调用testModule2
时,其中定义的所有函数都将重新创建。它的优点 - 私有变量,每个新对象的独立集合(注意克隆使用第一种方法创建的对象的差异)。