闭包
来源:互联网 发布:企业管理平台软件 编辑:程序博客网 时间:2024/04/30 11:28
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].onclick=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].onclick=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.onload=fuction(){
var oDiv = document.getElementById("div");
oDiv.onclick=function(){
alert(oDiv.id);
}
window.onunload=function(){
oDiv.onclick=null;
}
}
var oDiv = document.getElementById("div");
oDiv.onclick=function(){
alert(oDiv.id);
}
window.onunload=function(){
oDiv.onclick=null;
}
}
eg2:
window.onload=fuction(){
var oDiv = document.getElementById("div");
var oDiv = document.getElementById("div");
var id=oDiv.id
oDiv.onclick=function(){
alert(id);
};
oDiv=null;
}
oDiv.onclick=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);//报错
0 0
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- sql数据库类型与c#数据库类型
- poj3320
- 黑马程序员零基础解析第一个Objective-c程序
- 多边形重心问题
- 闹钟
- 闭包
- SQL FOREIGN KEY 约束
- Java的学习发展经历 —— Java二十周年 (οωο)
- vector 赋值方法
- keepalived+lvs实现lvs的高可用
- Lua中使用Web开发
- 从内存字节流到文件—GlobalAlloc,GlobalLock,LockResource等用法
- git常见操作和常见错误
- __declspec(novtable) 的用法