闭包

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)
        }
    })()
}

以上就是闭包问题的几种方法,当然还有其他的方法。找到一个合适自己的使用吧

苦难