Javascript 无法将变量传递给函数

Javascript 无法将变量传递给函数,javascript,html,Javascript,Html,我想将当前索引传递给通过FileApi读取图像并显示图像预览的函数: for(var i = 0, f; f = files[i]; i++) { if (!f.type.match("image.*")) { continue; } var reader = new FileReader(); reader.onload = (function(theFile) { return function(e) { var dv = document.cr

我想将当前索引传递给通过FileApi读取图像并显示图像预览的函数:

for(var i = 0, f; f = files[i]; i++) {
  if (!f.type.match("image.*")) {
    continue;
  }

  var reader = new FileReader();
  reader.onload = (function(theFile) {
    return function(e) {
      var dv = document.createElement("div");
      //.............

    };
  })(f);

  reader.readAsDataURL(f);
}
我试过这个:

  //.......
  var reader = new FileReader();
  reader.onload = (function(theFile, i2) {

    //i2 is defined here

    return function(e) {
      var dv = document.createElement("div");

      //i2 isn't defined here



    };
  })(f, i);

但正如你所看到的,i2并没有定义。如何解决这个问题?

如果稍微组织一下包装器函数,就可以正确地确定所有内容的范围。在这里,我基本上将整个循环体包装在一个自调用函数中。然后,onload处理程序只是一个普通的旧函数赋值。在生产代码中,可以删除虚拟onload

var文件=['1','2','3'];
for(var i=0,f;f=files[i];i++){
(功能(i,f){
var reader=new FileReader();
reader.onload=函数(){
var dv=document.createElement(“div”);
控制台日志(f+i);
};
//虚拟加载
(功能(r){
设置超时(r.onload,1000+(i+1)*333);
})(读者);
})(i,f)

}
但正如您所看到的,i2没有定义
-您说它没有定义,但我们看不到它没有。您可以通过console.log(i)查看它是否定义了?这个例子:
onload=function(f,i){returnfunction(e){console.log(f,i);}}(“filename”,2);onload()
显示它已定义您的代码逻辑(如问题中所示)应该可以正常工作-正如您在这个虚拟的小提琴中所看到的-也许您在实际应用中做了一些错误的事情code@gilbertxenodike,每件事都有定义,但你在做很多花哨的把戏来重新审视事物,结果是缩小了超出你预期的范围。试着减少对范围的幻想,它应该会起作用。这读起来更像是一个发现差异的游戏,而不是一个答案。你改变了什么?为什么要解决这个问题?