看到js主流的单例模式的写法都是用到闭包的,就有点纳闷,其实有种单例模式的写法更简洁更好用:
function a() {
if(a.once) return;
a.once = true;
// code...
}
a(); // code执行了
a(); // code不执行
a.once = true;
a(); // code执行了
a(); // code不执行
这不更香吗,外部还能控制要不要重置这个单例模式。
但是后面又想到了:闭包最大的好处在于在外部函数中声明的变量不会污染全局,这就是上面这种"简洁的代码"所做不到的。
比如,我要做出一个这样的函数------每次执行时都能打印一个数,这个数初始为0,且这个数每次都增加一。
function a() {
if(a.once) return;
a.once = true;
if(a.num === undefined) a.num = 0; // (*)
else a.num += 1;
console.log(a.num);
// code...
}
还得写(*)这行,是不是觉得很烦?如果只是一个变量你可能不会觉得很烦,但是如果需要多个呢?那不裂开。
那如果用大众使用的单例模式呢,明显就不用这么麻烦:
let a = (function() {
let once = false;
let num = 0;
return function() {
if(once) return;
once = true;
console.log(num++);
};
})();
不管加多少个变量,看起来用起来都很舒服,不亏是大众的眼光。
总结
- 如果不需要很多的变量,用第一种代码实现单例模式也是不错的选择
- 如果需要很多的变了,那肯定用第二种写法咯
- 建议统一用第二种,因为统一一下会更好,第一种了解一下就好了