# 闭包
# 什么叫闭包
闭包首先肯定是一个函数,一个可以访问另一个函数作用域变量的函数。一般是外层函数中的内函数
# 为什么要使用闭包
因为局部变量无法长久保存和共享,而全局变量会造成变量污染。所以需要一种机制既可以长久保存又不会全局污染,因而闭包就产生了。
# 闭包的使用场景
闭包有俩个使用场景:
- 函数作为返回值
参考例子:
var getNum;//------------------------1
function getCounter() { // ----------2
var n = 1;
var inner = function () { return n++; }
return inner;
}
getNum = getCounter();//------------3
console.log(getNum()); //1 ---------4
console.log(getNum()); //2 ---------5
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 函数作为参数传递
# 闭包的主要用途
闭包在实际应用中主要用于封装变量和收敛权限 参考例子:
function isFirstLoad(){
var _list=[]
return function (id) {
if(_list.indexOf(id)>0){
return false
}else{
_list.push(id)
return true
}
}
}
var fistLoad=isFirstLoad()
fistLoad(10) //true
fistLoad(10) //false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 面试题举例
问题:创建10个a标签点击的时候弹出来对应的序号(function(i){ ...})(i)自执行函数
var i
for(i=0;i<10;i++){
(function(i){
var a=document.createElement('a')
a.innerHTML=i+'<br>'
a.addEventListener('click',function(e){
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
})(i)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13