js单例模式:这是种更香的写法

看到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++);
	};
})();

不管加多少个变量,看起来用起来都很舒服,不亏是大众的眼光。

总结

  1. 如果不需要很多的变量,用第一种代码实现单例模式也是不错的选择
  2. 如果需要很多的变了,那肯定用第二种写法咯
  3. 建议统一用第二种,因为统一一下会更好,第一种了解一下就好了
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值