首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JS 变量作用域有关问题

2013-03-22 
JS 变量作用域问题在做html5的上传,可以使fileReader的onload的时候,输出的i一直都是最后的值,而不是0,1,2

JS 变量作用域问题
在做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]);

                    
                 }
                 
             });


[解决办法]
fRead.onload =(function(_i){
    return  function (e){
                        console.log(_i);
                  }
})(i);
[解决办法]
fRead.onload = function (e) {
    console.log(i);
};

改成下面试试

fRead.onload = function (index) {
    return function () {
        console.log(index);
    };
}(i);
[解决办法]
引用:
上面的两位的可以,我有个疑问,为什么这样可以呢
JavaScript code?1234567891011   var func_arr = [];        for (var i = 0; i < 5; ++i) {            func_arr.push(function () {                console.log(i);     ……


你这段代码是在全局作用域里执行的吧?所以不会产生闭包,但是如果你将
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]();
}


[解决办法]

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

热点排行