在JS中调用回调时不正确的变量

时间:2011-09-13 21:29:22

标签: javascript

我在以下代码中获取了错误的文件名。我确定这显然是错误的,但我没有看到它。我得到了正确数量的错误,但所有文件名都是相同的,而不是错误的文件名。

for(var i=0; i<this.files.length; ++i){
    var f = this.files[i];
    var reader = new FileReader();
    reader.onload = function(e) {
        if(e.total>maxFilesize){
            tooBigFilesLs.push(f.name);

2 个答案:

答案 0 :(得分:2)

我认为这是一个关闭问题与您的for循环。

Here是如何处理它的一个例子。

// Basic idea...

reader.onload  = (function(value) {
    return function() {
        alert(value);
    }
})(f.name);

答案 1 :(得分:2)

Javascript Closures

在“创建循环中的闭包:一个常见的错误”

中的那篇文章中只有一个例子

试试这个:

for(var i=0; i<this.files.length; ++i){
    var f = this.files[i];
    var reader = new FileReader();

    (function(name){

        reader.onload = function(e) {
            if(e.total>maxFilesize){
                    tooBigFilesLs.push(name);
        }
    }
     }(f.name));
}

(未经测试)

基本上,当您在'onload'上定义该函数时,您正在创建一个闭包,并且您在该循环中创建的所有函数都共享它,因此所有函数都可以访问'f'和'reader',所以' f'将继续指向循环中的最后一个文件。在我的示例中添加匿名闭包,使用'name'参数,确保'onload'中的函数获得正确的名称。