我遇到了一个片段,我怀疑它是否能以直截了当的方式编写。有人可以告诉我下面两个片段之间有什么区别:
var printer = (function () {
var printerInstance;
var obj = {
f1: function() {},
f2: function() {}
};
return {
getInstance: function() {
if(!printerInstance) {
printerInstance = obj;
}
return printerInstance;
}
};
})();
和
var printer = (function () {
var printerInstance;
function create() {
function f1() {}
function f2() {}
return {
f1: f1,
f2: f2
}
}
return {
getInstance: function() {
if(!printerInstance) {
printerInstance = create();
}
return printerInstance;
}
};
})();
我不明白为什么在第二个例子中的函数内部创建了对象。请澄清。
答案 0 :(得分:1)
嗯,第一个对所有呼叫都有一个名为obj
的对象,第二个为每个呼叫创建一个新对象。
例如说它是:
var obj = {
var counter = 0;
f1: function() { return counter++; },
f2: function() {}
};
,第二个是:
function create() {
var counter = 0;
function f1() { return counter++; }
function f2() {}
return {
f1: f1,
f2: f2
}
}
在第一种情况下,有一个counter
的对象将被所有getInstance
个调用引用(其中printerInstance
等于null
)。所以这更像是Singleton。
在第二种情况下,getInstance
的每次调用都会拥有自己的计数器,并且会独立计数。