今天做关于选项卡的练习时,遇到了有关闭包的一个小问题,记录之。
for(var i=0;i<5;i++){
alert(i); //0,1,2,3,4;
}
然而,在循环内部添加事件函数时
for(var i=0;i<5;i++){
arr[i].onclick=function(){
alert(i); //5;
}
}
弹出的并不是我所盼望的0,1,2,3,4,而是5。因为在执行点击事件时,for循环已经执行完毕,此时闭包中的i向上查找,找到的就是循环结束后的变量i,即为5。
for(var i=0;i<5;i++){
}
alert(i) //5;
解决方案1:在循环内,将i作为数组的一个属性保存起来;
for(var i=0;i<5;i++){
arr[i].index=i;
arr[i].onclick=function(){
alert(this.index); //0,1,2,3,4
}
}
解决方案2:再加一层闭包,而i作为参数传递给内部函数;
for(var i=0;i<5;i++){
(function(arg){
arr[i].onclick=function(){
alert(arg); //0,1,2,3,4
}
})(i)
}
看来有关闭包方面的知识,还得再好好学习一下咯