在做html5的上传,可以使fileReader的onload的时候,输出的i一直都是最后的值,而不是
0,1,2,3....n ,$('#' + opts.fileId).change(function () {
              
                 var  files = document.getElementById(opts.fileId).files;
                 
                 var i =0
                
                 for (i = 0; i < files.length; i++) {
                   
                    var fRead = new FileReader();
                    fRead.onload = function (e){
                          console.log(i);
                    };
                    fRead.readAsDataURL(files[i]);                    
                 }
                 
             });

解决方案 »

  1.   

    fRead.onload =(function(_i){
        return  function (e){
                            console.log(_i);
                      }
    })(i);
      

  2.   

    fRead.onload = function (e) {
        console.log(i);
    };改成下面试试fRead.onload = function (index) {
        return function () {
            console.log(index);
        };
    }(i);
      

  3.   

    上面的两位的可以,我有个疑问,为什么这样可以呢 
     var func_arr = [];
            for (var i = 0; i < 5; ++i) {
                func_arr.push(function () {
                    console.log(i);
                });
            }        for (var i in func_arr) {
                func_arr[i]();
            }
      

  4.   

    你这段代码是在全局作用域里执行的吧?所以不会产生闭包,但是如果你将
    var func_arr = [];
            for (var i = 0; i < 5; ++i) {
                func_arr.push(function () {
                    console.log(i);
                });
            }
    放在一个函数中,并在函数的最后返回产生的数组,就不行了,当执行这个函数数组里的函数时,
    每次执行的结果就是相同的,因为产生了闭包。如:function createFunctions()
    {
       var funcArr = [];
      for (var i = 0; i < 5; ++i) {
          funcArr.push(function () {
              console.log(i);
          });
      }
       
       return funcArr;
    }var func_arr =createFunctions();
    for (var i in func_arr) {
        func_arr[i]();
    }
      

  5.   


    var fRead = new FileReader();
    fRead["Index"] = i;
                        fRead.onload = function (e){
                              console.log(this["Index"]);
                        };