闭包





1.

			document.body.innerHTML = "<div id='zbx1'>aaa</div>"
			+ "<div id='zbx2'>bbb</div><div id='zbx3'>ccc</div>";
			for(var i=1;i<4;i++){
				console.log(i);
			<span style="white-space:pre">	</span>document.getElementById('zbx'+ i).addEventListener('click',function(){
					console.log(i)
				});
			}
以上这段代码希望的是每次点击页面上的id zbx1 zbx2 zbx3   第二个console.log的输出的i分别对应1 2 3;

但是输出的结果都是4,这是为什么呢?是应为 当页面加载的时候已经for循环已经循环过了,可以通过第一个console.log看出输出了1,2,3 

那如何让第二个console.log的输出的i分别对应1 2 3;


通过闭包方式:

			document.body.innerHTML = "<div id='zbx1'>aaa</div>"
			+ "<div id='zbx2'>bbb</div><div id='zbx3'>ccc</div>";
			for(var i=1;i<4;i++){
				console.log(i)
				!function (i){<pre name="code" class="javascript"><pre name="code" class="javascript"><pre name="code" class="javascript">				<span style="white-space:pre">	</span>console.log(i)

document.getElementById('zbx'+ i).addEventListener('click',function(){console.log(i)});

}(i);

}

 
 
 
 通过一个立即执行的匿名函数,将每次for循环的值传进匿名函数中 
!function (i){}(i);
 

当每一次点击i就会取自匿名函数里闭包环境的i,i来源于每一次循环赋值的i。 

 2.

!function(){
	var _userId = 23492;
	var _typeId = "item";
	var exportName = {};
	
	function converter(userId){
		return +userId;
	}
	exportName.getUserId = function(){
		return converter(_userId);
	}
	exportName.getTypeId = function(){
		return _typeId;
	}
	window.exportName = exportName;
}();
console.log("Id" + exportName.getUserId()) //Id23492
console.log(exportName.converter) //underfined







这篇文章写得很不错,从中悟到了一些!http://kb.cnblogs.com/page/110782/






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值