for 循环里的闭包

现在要实现一个小功能

<ul>

<li>0</li>

<li>1</li>

<li>2</li>

<li>3</li>

</ul>

点击0123输出有序数字!

如果猜得没错你会很自信的这么写,

<script type="text/javascript">

var li = document.getElementsByTagName('li');

for (var i = 0; i < li.length; i ++) {

li[i].addEventListener('click',function () {

console.log(i);
	
},false)

}

</script>

然后你会发现全部输出4,事实证明这是错误的!

分析:  

for循环在循环的事件

function () {
	
	console.log(i);
	
	}

但是那个匿名函数是在for循环执行完成后(用户单击链接时)才被调用的,

调用的时候需要找到变量  i  ,函数内部没有  i  ,所以使用外界的变量 i  ,

循环的时候  i  不小于 li.length  的时候,i  的值为4 ,所以点击时会输出这个  4.

正确的做法是

<script type="text/javascript">
	
var li = document.getElementsByTagName('li');
	
for (var i = 0; i < li.length; i ++) {
	
(function (i) {
	
li[i].addEventListener('click',function () {
		
console.log(i);
		
},false)
		
}(i))
	
}
	
</script>

在外围添加一个立即执行函数,使用  i  传参

模拟它的循环

第一圈
(function (0) {

	li[0].addEventListener('click',function () {
	
	console.log(0);
	
	},false)
	
	}(0))

}

第二圈
(function (1) {

	li[1].addEventListener('click',function () {
	
	console.log(1);
	
	},false)
	
	}(1))

}

......

相当于给每个元素都绑定了事件

猜你喜欢

转载自blog.csdn.net/dfggffdd/article/details/80148737