<script >
    var arr = []
    for(var i=0;i<10;i++){
         arr.push(function(){
             console.log(i)
         })
    }
    arr[6]();//10
    
    
    </script>

解决方案 »

  1.   

    数字里面每个元素是一个匿名函数,当你执行arr[6]里面的函数的时候,i的值这个时候已经实际变成了10了啊,因为循环早已经结束了。换言之,10个数组里面的函数,访问的都是同一个变量i,而不是10个变量,访问i的时候,i的值已经变成了10.
      

  2.   

    输出10就是因为没有用闭包。原因楼上已经说的很清楚了。
    解决方法也就是加上一居闭包,让每次循环都单独在一个闭包内产生一个i变量。
        var arr = []
        for(var i=0;i<10;i++){
            (function(i){
                arr.push(function(){
                    console.log(i)
                });
            })(i);
        }
      
    或者是把i改成let块作用域变量,其原理与闭包一样。
        var arr = []
        for(let i=0;i<10;i++){
             arr.push(function(){
                 console.log(i)
             })
        }
      

  3.   


      var arr = []
        for(var i=0;i<10;i++){
             arr.push(function(){
                 console.log(i)
             })
    console.log(arr[i]())
        }在你里面执行每次push进去一个函数的时候,直接调用这个时候,所得到的的就是你想要的值,循环完之后 在调用,这个时候 i 已经是10,不管你调用的是 arr[1]()   .... arr[6]都是10
      

  4.   

        var arr = []
        for(let i=0;i<10;i++){
             arr.push(i)
        }
      

  5.   

    https://www.cnblogs.com/fly_dragon/p/8669057.html