闭包

定义函数嵌套函数,内部函数可以访问外部函数的变量和参数,外部函数的参数和变量不会被垃圾回收机制所收回。

好处

  1. 一个变量可以长期驻扎在内存中

        //函数aa执行完后,变量a不会被立即回收,bb还会调用a

        function aa(){

                 var a=1;

                 return functionbb(){

                           alert(a);

                 }

        }

        var cc=aa();

        cc();//2

  2. 不会污染全局变量

    //可以实现变量a的累加,但是会污染全局变量

        var a=1

        function aa(){

                 a++;

                 alert(a);

        }

        aa();//2

        aa();//3

        //不能实现a的累加,在函数内部,虽然不会污染全局变量,但是变量a在函数执行完后会被回收,下次执行的时候会重新赋值。

        function aa(){

                 var a=1;

                 a++;

                 alert(a);

        }

        aa();//2

        aa()//2

        //使用闭包可以实现a的累加,而且不会污染全局变量,外层函数执行完后a不会被回收

        function aa(){

                 var a=1;

                 return functionbb(){

                           alert(a);

                 }

        }

        var cc=aa();

        cc();//2

        cc();//3

  3. 私有成员的存在 

        //私有成员的存在

        var dd=(function aa(){

                 var a=1;

                 function bb(){

                           a++;

                           alert(a);

                 }

                 function cc(){

                           a++;

                           alert(a);

                 }

                 return {b:bb,c:cc}

        })();

        dd.b();//2

                 dd.c();//3

用法:

  1. 模块化开发

  2. 在循环中找到对应元素的索引

<!DOCTYPE HTML> 
<html> 
<head> 
<meta charset="utf-8" /> 
<title>闭包演示</title> 
<style type="text/css"> 
    p {background:gold;}  
</style> 
<script type="text/javascript">   
/*function init() { 
	var pAry = document.getElementsByTagName("p"); 
	for( var i=0; i<pAry.length; i++ ) { 
		pAry[i].onclick = function() { 
			alert(i); 
		} 
	} 
} 
//加一层闭包,返回一个函数作为事件响应
function init(){
	var pAry=document.getElementsByTagName("p");
	for(var i=0;i<pAry.length;i++){
		pAry[i].οnclick=(function(num){
			return function(){
				alert(num);
			}
		})(i);
	}
}
//加一层闭包,i以函数参数形式传给内层函数
function init(){
	var pAry=document.getElementsByTagName("p");
	for(var i=0;i<pAry.length;i++){
		(function(num){
			pAry[i].οnclick=function(){
				alert(num);
			}
		})(i);		
	}
}
//加一层闭包,i以局部变量形式传给内层函数
function init(){
	var pAry=document.getElementsByTagName("p");
	for(var i=0;i<pAry.length;i++){
		(function(){
			var num=i;
			pAry[i].οnclick=function(){
				alert(num);
			}
		})();		
	}
}
//将变量i保存在每个p对象的属性中
function init(){
	var pAry=document.getElementsByTagName("p");
	for(var i=0;i<pAry.length;i++){
		pAry[i].i=i;
		pAry[i].οnclick=function(){
			alert(this.i);
		}
	}
}
//将变量i保存在匿名函数自身的属性中
function init(){
	var pAry=document.getElementsByTagName("p");
	for(var i=0;i<pAry.length;i++){
		(pAry[i].οnclick=function(){
			alert(arguments.callee.i);
		}).i=i;
	}
}
//利用Function构造函数
function init(){
	var pAry=document.getElementsByTagName("p");
	for(var i=0;i<pAry.length;i++){
		pAry[i].οnclick=new Function("alert("+i+");");//new一次产生一个函数实例
	}
}
function init(){
	var pAry=document.getElementsByTagName("p");
	for(var i=0;i<pAry.length;i++){
		pAry[i].οnclick=Function("alert("+i+");");
	}
}*/
</script>   
</head>   
<body οnlοad="init();">   
<p>产品 0</p>   
<p>产品 1</p>   
<p>产品 2</p>   
<p>产品 3</p>   
<p>产品 4</p>   
</body>   
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值