盒子
盒子
文章目录
  1. 1、实现计数
  2. 2、实现单例
  3. 总结:

闭包实现单例

1、实现计数

一般的计数器会受到外界变量的影响和改变,闭包可以很好解决这个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//  立即执行函数执行完count对外界已经不可见
var creator = (function() {
var count = 0; // 计数器
var obj = { // 返回的对象
next() { // 计数器加一
return count++; // “记住”count
},
set(v) {
if(v >= count) {
count = v; // “记住”count
} else {
throw new Error('current index is bigger than your input!');
}
}
}
return obj;
})()

外界虽然访问不到count了,但其实count存在内存中因为,creator引用了obj对象,obj对象内存不被清除,而obj对象的next和set方法引用了count变量,因此count也被保存在内存中,不会被垃圾回收机制回收!

用法:

1
2
3
4
5
6
7
var a = creator.next();
console.log(a); // 0
var b = creator.next();
console.log(b); // 1
creator.set(10);
var c = creator.next();
console.log(c); // 10

注意:如果window存在全局变量count呢?对上述的计时器有没有影响?答案是没有,因为:函数的作用域链和函数创建的时候有关,和之行时候的环境无关!

1
2
3
4
5
6
7
var a = creator.next();
console.log(a); // 0
var b = creator.next();
console.log(b); // 1
creator.set(10);
var c = creator.next();
console.log(c); // 10

2、实现单例

原理一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var SingletonFactory = (function() {
var instance = null;
function Singleton(name) {
this.name = name;
}

var _static = {
getInstance(name) {
if(instance === null) {
instance = new Singleton(name);
}
return instance;
}
}
return _static;
})()

var o = SingletonFactory.getInstance('alin');
var o1 = SingletonFactory.getInstance();
console.log(o === o1); // true

总结:

上面的理念一样,都是定义一个私有变量(count,instance)立即执行函数执行完之后,外界不能直接访问,而这个私有变量又不被销毁,供内部函数使用,而外界只能通过返回的函数去简介访问该变量,其中函数就可以做一些拦截和校验了!!!

支持一下
扫一扫,支持 Alin
  • 微信扫一扫
  • 支付宝扫一扫