Fork me on GitHub

浅析闭包

闭包的概念:

函数的闭包形成闭包;封闭的区域(可以调用其他作用域变量的函数);
闭包的组成:内层函数本身;内层函数所处的作用域;

闭包作用:

1. 形成隔离的封闭空间;
1
2
3
4
5
6
//函数里面的num不会影响外面num的值;
var num = 100;
(function(){
var num = 1000;
})()
console.log(num)
2. 延长变量的声明周期;
3. 匿名自制行环境–沙箱
  • 插件常用的内部变量外放的操作,将window和document作为实参放入沙箱之内,防止内部变量对于外部的影响
  • 减少作用域链;
1
2
3
4
(function(window, doc){
if (typeof exports !== 'undefined') exports.touchScroll = iScroll;
else window.touchScroll = iScroll;
})(window, document);
4. 缓存变量
1
2
3
4
5
6
7
8
9
var arr = [];
for(var i=0;i<10;i++){
arr[i] = (function (n){
return function(){
console.log(n)
}
})(i)
};
arr[3](); //结果是3;
5.实现类和继承
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
function Person(){
var name = "default";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
};

var p = new Person();
p.setName("Tom");
alert(p.getName());

var Jack = function(){};
//继承自Person
Jack.prototype = new Person();
//添加私有方法
Jack.prototype.Say = function(){
alert("Hello,my name is Jack");
};
var j = new Jack();
j.setName("Jack");
j.Say();
alert(j.getName());
6.大量封装函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var person = function(){
// var num = '0';
return {
sum : function (num) {
var sum = 0;
for(var i=0;i<=num;i++){
sum+=i;
}
return sum;
},
mul : function (num) {
var mul = 1;
for(var i = 1;i<=num;i++){
mul*=i;
}
return mul;
}
}
}();
7.案例
1
2
3
4
5
6
7
var arr=[];
for(var i=0;i<3;i++){
arr[i]=(function(j){return function(){console.log(j)}})(i)
}
arr[0]();
arr[1]();
arr[2]();
1
2
3
4
5
6
7
//生成随机数
function getNum(){
var num=parseInt(Math.random()*10+1);
return function(){
return num;
}
};