for循环中遍历不到i值的解决方法。也就是闭包的问题。
for获取值的问题(闭包)
for(var i=0;i<a.length;i++){}在循环内的数值,变化是把i遍历了一边。
在循环外得到的值是循环结束后的值。
1、将变量i保存在每个段落对象(p)上。如果在循环下出现点击事件函数,函数中获取不到i的遍历值。需要给点击事件增加一个属性
来保存遍历的i值。在点击事件中使用时,需要用到this(需要分清此时的this指向的那个
对象)。例:
for(var i=0;i<a.length;i++){
a[i].index=i;
// console.log(a)
a[i].onclick=function(){
console.log(a[i])//a[i]获取不到。this指向单个p;
}
}
2、如果在循环下面出现函数时,获取遍历值时,函数的执行需要在for循环下才能遍历到i的值
例:
var a=document.querySelectorAll('p');
for(var i=0;i<a.length;i++){
console.log(i)
function woqu (){
console.log(i)
}
woqu()//在此处执行函数时,可以遍历到i的值
}
woqu()//在此处执行函数时,不可以遍历到i的值
3、加一层闭包,i以函数参数形式传递给内层函数。
例:
var a=document.querySelectorAll('p');
console.log(a)
for(var i=0;i<a.length;i++){
(function(i){
a[i].onclick=function(){
console.log(a[i])
};
})(i);
}
4、加一层闭包,i以局部变量形式传给内存函数。
例:
var a=document.querySelectorAll('p');
for(var i=0;i<a.length;i++){
(function(){
var temp=i;
a[i].onclick=function(){
console.log(temp)
console.log(i)
}
})()
}
以上就是闭包问题的几种方法,当然还有其他的方法。找到一个合适自己的使用吧
