如下函数,想要打印出每个i的序号:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
<script>
var liCol = document.getElementsByTagName('li');
len = liCol.length;
for(var i = 0; i < len; i++){
liCol[i].addEventListener('click',function(){
console.log(i);
},false);
}
</script>
</html>
打印结果:3 3 3
分析:将事件绑定到对象上,等到循环结束时才执行函数里面的内容,所以打印出3;
解决办法:
使用闭包:立即执行函数
for(var i = 0; i < len; i++){
//立即执行函数
(function(i){
liCol[i].addEventListener('click',function(){
console.log(i);
},false);
}(i))
}
总结:绑定事件时,一旦事件出现在循环里面,就要考虑是否要使用闭包。 用到循环里面你的i时必须要使用闭包