简单的说,你在单击以前,for已经循环完了,i已经递增为3,而单击的事件处理程序中并没有定义i这个变量,所以会引用外部的i,所以一直都为3。要获取当前的i值需要传入i的值。 window.onload = function(){ var ul = document.getElementById("abc"); var li = document.getElementsByTagName("li"); for(var i=0;i<li.length;i++){ test(li[i],i); }
function test(obj,i){ obj.onclick=function(){ alert("你单击的是第"+i+"个LI!"); } }
var ul = document.getElementById("abc");
var li = document.getElementsByTagName("li");
for(var i=0;i<li.length;i++){
test(li[i],i);
}
function test(obj,i){
obj.onclick=function(){
alert("你单击的是第"+i+"个LI!");
}
}
}
第一个:论坛上的例子
第二个:闭包的理解
http://topic.csdn.net/u/20110111/18/56C5F609-7989-4E97-9E26-9E54FAD756E6.html#r_71177210
http://blog.csdn.net/hitman9099/article/details/3854171
var arr = [];
for(var i=0; i< 2;i++){
var fn = function(){
alert(i)
}
arr.push(fn);
} for(var j in arr){
var fn = arr[j];
fn();
}
答案是 2 , 2其实理应让其alert 0,1才对这是因为第一个for循环里面创建函数fn的时候里面的i始终是在同一个作用域
这样当循环2次后,又执行了一次i++,这时i等于2了. 因为是同一作用域,因此函数里面的i都是2
要解决此问题,只需要创建一个闭包来实现就可以了,修改第一个for循环:
var arr = []; for(var i=0; i< 2;i++){
(function(j){
var fn = function(){
alert(j)
}
arr.push(fn);
}(i)); // 创建一个匿名函数并立即执行,传入参数i
} for(var j in arr){
var fn = arr[j];
fn();
}
这样就打印 0 1 了.因为闭包里面的参数j跟i不是在同一作用域
运行上述程序的时候,firebug显示obj没有被定义