闭包
什么是闭包呢
闭包是一个概念
1.闭包可以将一个变量常驻在内存当中
2.闭包可以避免全局污染
3.闭包可以声明私有成员
闭包有的特点
1.函数嵌套函数
2.内部函数引用了外部函数的变量或者形参
3.内部函数引用变量和形参,不会被垃圾回收机制所回收。
这个就是一个闭包的结构案例:
function aaa(a){
var b = 20;
function bbb(){//嵌套函数
alert(a + ", " + b);
}
return bbb;
}
var res = aaa(10);//先读到这然后走函数
res();//10,20
alert(a + ', ' + b);//报错
那么接着我们分析下
不能声明全局变量会污染环境
又要实现累加(不使用循环的话单一函数无法实现累加)
那么:
function aaa(){
var a = 2;
function bbb(){
a++;//实现累加
alert(a);
}
return bbb;//拿到
}
var res = aaa();
res();//3
res();//4
alert(a);
然后我们又可以简化这个写法
像这样:var res = (function(){ })();
这个叫做立即执行函数写法:
var res = (function(){
var a = 2;
return function(){
a++;
alert(a);
}
})();
res();//3
res();//4
这个是立即执行函数写法的终极简化:
//1
function show(){
alert("hello world");
}
show();
//2
var show = function(){
alert("hello world");
}
show();
//3
(function(){
alert("hello world");
})();
闭包还有可以私有化变量的能力
var module1 = (function(){
var a = 10; //私有变量
var b = 20; //私有变量
function aaa(){ //私有方法
a += 5;
alert(a);
}
function bbb(){
b *= 10;
alert(b);
}
return {//对外暴露
funcA: aaa,
funcB: bbb
}
})();
module1.funcA();//15
module1.funcB();//200
alert(aaa);//报错
利用闭包再循环中找到按钮下标
window.onload = function(){
var aBtns = document.getElementsByTagName("button");
for(var i = 0; i < aBtns.length; i++){ //循环拿下标
aBtns[i].onclick = show(i);//点击按钮的下标去执行show,执行几遍下面闭包就几遍。
}
function show(index){
return function(){//闭包,两层函数。
alert(index);//
}
}
}
<button>11111111</button>
<button>22222222</button>
<button>33333333</button>
另外关于IE的内存泄漏问题
div很吃内存
window.onload = function(){
var oDiv = document.getElementById("div1");
oDiv.onclick = function(){
alert(oDiv.id);
}
window.onunload = function(){//页面解构的时候调用(没加载出来)
oDiv.onclick = null;
}
}