<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<style>
li{
cursor:pointer;
}
</style>
<ul id="ul1">
<li>sdfsd</li>
<li>ffff</li>
<li>222</li>
<li>aaa</li>
</ul>
</body>
<script>
var liList = document.getElementsByTagName("li");
// 有问题的写法
/*for(var i=0;i<lis.length;i++){
lis[i].onclick = function(){
alert(i);
}
}
i=40;*/
//此时,点击li,弹出框显示的信息是40.为什么呢?这说明i值已经被赋值成为40了。而由于点击onclick调用了匿名函数,调用会产生上下文,于是为这个匿名函数创建的上下文,其中它的自由变量i的值取到的是父级作用域的i值,此时i=40。又由于每调用一次onclick就会创建一个上下文,每次建立的上下文中的自由变量i的取值都取的父级作用域中的i值。所以!!点击onclick后,每次都会显示40.而不是0,1,2....。
//解决问题的写法1:使用闭包的第一种写法
/* for(var i=0;i<lis.length;i++){
lis[i].onclick = (function(i){
return function(){
alert(i);
}
})(i);
}*/
//解决问题的写法2:使用闭包的第二种写法
/* for(var i=0;i<lis.length;i++){
(function(i){
lis[i].onclick = function(){
alert(i+'a');
}
}
)(i);
}*/
// 解决问题的写法3,给它的属性赋值:
for(var i=0;i<liList.length;i++){
liList[i].index = i;
liList[i].onclick = function(){
alert(this.index);
}
}
</script>
</html>
闭包解决for循环 的代码示例,解释为什么for循环后,打印的i值不是它自己当时的取值
最新推荐文章于 2022-03-21 14:52:07 发布