<ul id="ul1">
<li>111</li>
<li>222</li>
<li>333</li>
<li>444</li>
</ul>
window.onload = function (){
var ULa = document.getElementById("ul1");
var lia = ULa.getElementsByTagName("li");
for(var i=0;i<lia.length;i++){javascript
}
lia[i].onclick = function(){ alert(i);//此时打印的都是4 缘由是闭包的问题 解析程序首先会在事件处理程序内部查找,这个匿名函数内部没有定义变量i,而后往上级查找,此时i为4 }; };
下面作下分析:由于在for循环里面指定给lia[i]
.onclick的事件处理程序,也就是onclick那个匿名函数是在for循环执行完成后(用户单击连接时)才被调用的。而调用时,须要对变量i求值,解析程序首先会在事件处理程序内部查找,但i没有定义。而后,又到方法外部去查找,此时有定义,但i的值是4(只有i大于4才会中止执行for循环)。所以,就会取得该值——这正是闭包(匿名函数)要使用其外部做用域中变量的结果。并且,这也是因为匿名函数自己没法传递参数(故而没法维护本身的做用域)形成的。java
解决方法:闭包
一、window.onload = function(){
var oUl = document.getElementById("ul1");
var aLi = oUl.getElementsByTagName('li');
for(var i=0;i<aLi.length;i++){
(function(e){
aLi[i].onclick = function(){
console.log(i);//所有打印4
}
})(i);
}函数
}spa
二、从匿名包装器中返回一个函数code
window.onload = function(){
var oUl = document.getElementById("ul1");
var aLi = oUl.getElementsByTagName('li');
for(var i=0;i<aLi.length;i++){
事件
} aLi [i].onclick = (function(e){ return function(){ alert(e + 1); }; })(i);
}ip