js在for循环里边定义函数用到自增变量产生的问题

笔者最近做了很多的应聘笔试题,其中有一个让我印象特备深刻,关于在一个for循环里边些函数运用到for循环里边定义的变量的问题,废话不多说,先上代码,大家可以看看这段代码最后的结果是什么:

var array=[];//定义一个数组,空的
for(var i=0;i<3;i++){
    array[i]=function(){
        alert(i);
    }
}
array[0]();
array[1]();
array[2]();

初学者可能咋一看,想,这不是很简单吗?依次弹出0,1,2。亲爱的同学们,你可以亲自试一试,结果会出乎你的意料,结果是弹出三次3,这道底是为什么呢?让我们来仔细研究一下。


这段代码在执行的时候首先会新建立一个全局数组array,这是个空数组。在每一次for循环的时候,在进入for循环内部,是不会执行(进入)array[i]的函数体内部的内容的,但是此时会把array[i]加入到全局的作用域链中去。在for循环结束之后(此时i应该等于3了),也就是在函数初始化结束之后,我们现在真真正正的调用一下我们刚刚创建的函数,此时,程序才回去执行函数体内部的东西,要输出i的值,但是此时i的值已经是3了,所以输出来的全是3。


找到了这个问题,我们现在来想想办法解决它吧,可惜,笔者的js功底薄,还木有找到解决数组函数的这个问题的办法。不过,如果是对象(如通过li标签获取的一串文档对象),那我就可以解决他了,如下:

var array=document.getElementsByTagName("li");//获取节点元素,当然不会只有一个接点
for(var i=0;i<3;i++){
    array.index=i;
    array[i].onclick=function(){
        alert(this.index);
    }
}
//点击就可以触发函数执行了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章