好玩的JavaScript(二)

好玩的JavaScript!

#案例

1
2
3
4
5
6
7
8
9
10
11
//用闭包缓存变量
var fun = (function unique(){
var i = 0;
function f(){
return i++;
}
return f;
}());
console.log(fun());
console.log(fun());
console.log(fun());

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//闭包缓存变量拓展 
var counter = (function(){
var i = 0;
return {
add : function(){
return i++;
},
reset : function(){
return i = 0;
}
}
}());
console.log(counter.add());
console.log(counter.add());
console.log(counter.reset());
console.log(counter.add());


//用函数属性缓存变量
uniqueInteger.counter = 0 ;
function uniqueInteger(){
return uniqueInteger.counter ++ ;
}
console.log(uniqueInteger());
console.log(uniqueInteger());
console.log(uniqueInteger());
console.log(uniqueInteger());
console.log(uniqueInteger());

我们可以看出用函数属性,或者闭包都可以缓存变量
用闭包缓存变量好,还使用函数属性缓存变量好?
答案是肯定的.闭包好.
我们可以发现函数属性暴露在外面.闭包则不是.
我们没有机会误操作修改缓存的变量.
这就是闭包的魔力.
另外,之前说过闭包是局部作用域和全局作用域的桥梁
仔细在看看用闭包缓存变量的代码
return f;
这个返回值意味着什么
并不是简简单单的返回一个函数名
更深层的看一下,通过这个函数名.
我们在全局获得了unique函数的整个变量作用域!!!
这就是闭包!!!



//用函数作为命名空间
//小打小闹好玩的JavaScript番外
var SideBar = (function Module(){
var SideBar = {
num : 1,
animation : function(){
function f(){
console.log(this == window);
}
console.log(this == SideBar);
f();
}
}
return SideBar;
}());
console.log(SideBar.num);
SideBar.animation();