1.什么是闭包
函数嵌套函数。
内部函数可以引用外部函数的参数和变量。
参数和变量不会被垃圾回收机制所收回。
var b=5; //a、b都不会被垃圾回收机制回收,因为bb()函数要引用
function bb(){
alert(a); //undefined
alert(b); //5
}
return bb;
}
var c=aa();
c();
2.好处
1》可以长期的驻扎到内存中。
2》避免全局变量的污染,提高性能。
eg1:
var a=1;
function b(){
a++;
alert(a);
}
b();
b();
function b(){
a++;
alert(a);
}
b();
b();
function b(){
var a=1;
var a=1;
a++;
alert(a);
}
b();
b();
}
b();
b();
eg2:
//函数形式
function aa(){
var a=1;
return function()
{ a++;
alert(a);
}
}
var c=aa();
c();
c();
alert(a);//报错
var a=1;
return function()
{ a++;
alert(a);
}
}
var c=aa();
c();
c();
alert(a);//报错
//函数表达式的形式
var aa=(function (){
var a=1;
return function()
{ a++;
alert(a);
}
}
var a=1;
return function()
{ a++;
alert(a);
}
}
)();
aa();
aa();
aa();
3》私有成员和私有函数存在。
eg3:
var aa=(function(){
var a=1;
function b(){
alert(a);
};
function c(){
a++;
alert(a);
}
return {
dd:b,
ee:c
}
})();
aa.dd();
aa.ee();
alert(a);//报错,因为访问不到私有变量
alert(bbb);//报错,因为访问不到私有函数
alert(ccc);//报错
var a=1;
function b(){
alert(a);
};
function c(){
a++;
alert(a);
}
return {
dd:b,
ee:c
}
})();
aa.dd();
aa.ee();
alert(a);//报错,因为访问不到私有变量
alert(bbb);//报错,因为访问不到私有函数
alert(ccc);//报错
用法:
a.模块化代码:见上面的eg2,eg3.
b.在循环中找到对应的索引
法一:
<body>
<ul id="ul1">
<li>111</li>
<li>222</li>
<li>3333</li>
</ul>
<script>
var oUl=document.getElementById("ul1");
var aLi=oUl.getElementsByTagName("li");
for(var i=0;i<aLi.length;i++){
(function(i){
aLi[i].οnclick=function(){
alert(i);
}
})(i);
}
<ul id="ul1">
<li>111</li>
<li>222</li>
<li>3333</li>
</ul>
<script>
var oUl=document.getElementById("ul1");
var aLi=oUl.getElementsByTagName("li");
for(var i=0;i<aLi.length;i++){
(function(i){
aLi[i].οnclick=function(){
alert(i);
}
})(i);
}
</script>
</body>
法二:
<body>
<ul id="ul1">
<li>111</li>
<li>222</li>
<li>3333</li>
</ul>
<script>
var oUl=document.getElementById("ul1");
var aLi=oUl.getElementsByTagName("li");
for(var i=0;i<aLi.length;i++){
aLi[i].onclick=(function(i){
return function(i){
alert(i);
}
})(i);
}
<ul id="ul1">
<li>111</li>
<li>222</li>
<li>3333</li>
</ul>
<script>
var oUl=document.getElementById("ul1");
var aLi=oUl.getElementsByTagName("li");
for(var i=0;i<aLi.length;i++){
aLi[i].onclick=(function(i){
return function(i){
alert(i);
}
})(i);
}
</script>
</body>
3.闭包的问题
a.IE下的内存泄露问题(即变量内外互相引用,导致占有的内存得不到释放)
eg1:
window.οnlοad=fuction(){
var oDiv = document.getElementById("div");
oDiv.οnclick=function(){
alert(oDiv.id);
}
window.οnunlοad=function(){
oDiv.οnclick=null;
}
}
var oDiv = document.getElementById("div");
oDiv.οnclick=function(){
alert(oDiv.id);
}
window.οnunlοad=function(){
oDiv.οnclick=null;
}
}
eg2:
window.οnlοad=fuction(){
var oDiv = document.getElementById("div");
var oDiv = document.getElementById("div");
var id=oDiv.id
oDiv.οnclick=function(){
alert(id);
};
oDiv=null;
}
oDiv.οnclick=function(){
alert(id);
};
oDiv=null;
}
var a=1;
function b(){
a++;
alert(a);
}
b();
b();
function b(){
a++;
alert(a);
}
b();
b();
function b(){
var a=1;
var a=1;
a++;
alert(a);
}
b();
b();
}
b();
b();
function aa(){
var a=1;
return function()
{ a++;
alert(a);
}
}
var c=aa();
c();
c();
alert(a);//报错
var a=1;
return function()
{ a++;
alert(a);
}
}
var c=aa();
c();
c();
alert(a);//报错