闭包

闭包

什么是闭包呢

闭包是一个概念
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;
				}
			}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值