点击事件举例:
点击li获取每个li在兄弟节点的位置
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>闭包</title>
</head>
<body>
<ul id='ul'>
<li>aaa</li>
<li>aaa</li>
<li>aaa</li>
</ul>
<script>
//获取li的集合
var oli=document.getElementById('ul').getElementsByTagName('li');
//遍历oli
for(var i=0;i<oli.length;i++){
oli[i]._index=i;//给每个元素添加一个属性,并把每次遍历的序号保存到属性中,添加属性值.
oli[i].onclick=function(){
alert(this._index);//这时候会弹出3;因为for循环在执行的时候函数不会执行,只有在事件触发的时候才会执行。当事件触发的时候。for循环早已遍历完毕。再触发事件的时候,最后i会变形成3。 this当前对象(当前li);
};
}
</script>
</body>
</html>
总结:
1.获取到 li的集合之后,遍历oli给每个li给添加点击事件。
2.事件函数 弹出当前的位置。
3.在for循环执行的时候函数是不会执行的。因为没有调用。再循环结束的时候才调用了函数。 这时候i的值就变形成了3 , 所以函数执行的时候就会弹出 3;
解决闭包问题:
1.在循环的同时给每个元素添加一个属性。把每次遍历的索引号 保存到属性中。当事件触发的时候,把当前对象的 新增的属性值取出。