Javascript FileReader()-闭包和传递参数的问题

Javascript FileReader()-闭包和传递参数的问题,javascript,closures,filereader,Javascript,Closures,Filereader,我对这次活动有几个问题: 以下两个代码段之间得到不同结果的原因是什么?只要我传递对象实例,而不是显式的this.attachmentIndex值,我就会得到不同的结果 1) 2) Closure-FileReader.onload() 我面临的另一个问题是,我似乎无法将多个参数传递给我的FileReader.onload()事件处理程序 fileReader.onload = (function (file, one, two) { return func

我对这次活动有几个问题:

以下两个代码段之间得到不同结果的原因是什么?只要我传递
对象
实例,而不是显式的
this.attachmentIndex
值,我就会得到不同的结果

1) 2) Closure-FileReader.onload() 我面临的另一个问题是,我似乎无法将多个参数传递给我的
FileReader.onload()
事件处理程序

        fileReader.onload = (function (file, one, two) {
            return function (evt) {
                one // 1
                two // undefined
            };
        })(f, 1, 2);
下面你们可以找到整个物体。我不得不做一些丑陋的事情来达到我想要的。我真的希望有更好的方法达到同样的效果

function Note() {
    this.attachmentOutput = [];
    this.attachmentIndex = 0;
    this.debugging = false;
    this.currentWorkingObject = new NoteObject(helperFn.createGuid());
    this.addAttachement = function(files) { 
        for (var i = 0, f; f = files[i]; i++) {
            var fileReader = new FileReader(),

            fileReader.onload = (function (file, obj) {
                return function (evt) {
                    var base64File = evt.target.result;
                    obj["note"].addDataToAttachementObj(obj["index"], { data: base64File })
                };
            })(f, { note: this, index: this.attachmentIndex});

            // Async => reading file
            fileReader.readAsDataURL(f);

            this.attachmentIndex++
        }

        var html = app.outputTemplate(this.currentWorkingObject.attachements);
        $('.upload-output').html(html);
    };

};
函数的触发器:

$(".upload-drop-zone").on('drop', function (e) {
        e.preventDefault();
        var files = e.originalEvent.dataTransfer.files;
        app.myCurrentNote.addAttachement(files);
    });
我想要0作为闭包中的索引值的结果-在最后I 明白了,但这是一个丑陋的解决办法。如果我不能通过考试 参数,然后我得到1,我不知道为什么

FileReader
是异步的
this.attachmentIndex
似乎在

    // Async => reading file
    fileReader.readAsDataURL(f);

    this.attachmentIndex++ // <- `this.attachmentIndex` incremented to `1` here
//异步=>读取文件
fileReader.readAsDataURL(f);

this.attachmentIndex++//预期的结果是什么?我想要
0
作为闭包中
索引
值的结果-最后我得到了它,但只是使用了这个丑陋的解决方法。如果我没有显式地传递参数,那么我得到
1
,我不知道为什么。如果我能把
这个
传递到闭包,然后从那里访问
附件索引
,会容易得多。不确定是否正确解释了这个问题?在
var i=0,f时,在
中为
循环设置
f
的目的是什么?是否在
f=files[i]
中定义了
i
?已尝试(var i=0;i{
?它为我节省了检索文件对象的额外麻烦。在代码中我还需要
I
,我刚才跳过了这个代码段,因为我认为它不相关。这就是我的想法,但为什么
这个
+访问闭包中的索引会给我一个不同的结果,然后将它显式地作为
this.att传递achmentIndex
@KingJulien不确定以下内容“为什么this+访问闭包中的索引会给我一个不同的结果,然后将其显式传递为
this.attachmentIndex
”正确?尝试从
文件读取器.onload
事件中增加
此.attachmentIndex
?例如,
文件读取器.onload
之前定义
它=此;
,在
文件读取器.onload
中,在
添加数据到AttachmentObj
+该.attachmentIndex
$(".upload-drop-zone").on('drop', function (e) {
        e.preventDefault();
        var files = e.originalEvent.dataTransfer.files;
        app.myCurrentNote.addAttachement(files);
    });
    // Async => reading file
    fileReader.readAsDataURL(f);

    this.attachmentIndex++ // <- `this.attachmentIndex` incremented to `1` here