JavaScript For循环仅执行迭代器的最后一个值

时间:2014-09-09 21:50:48

标签: javascript arrays closures

我正试图从某个网站下载文件'website.com'。我在array中拥有所有唯一的ID。

这是我写的代码:

for(var i=0;i<ids.length;i++) {
    var timeInterval = 1000;
    (function(i,timeInterval){
        setTimeout(function(){
            var link = document.createElement('a');
            link.href= "http://website.com/download/"+ids[i];
            var e = document.createEvent('MouseEvents');
            e.initEvent('click', true, true);
            link.dispatchEvent(e);
            console.log(ids[i]);
            console.log(timeInterval);
        }, timeInterval);
        timeInterval = (i+1)*1000;
    })(i,timeInterval);
}

问题在于它下载了与数组id的最后一个元素相对应的文件,而不是全部 如何使循环适用于ids中的每个元素?
PS:我尝试过在不同相关问题中给出的各种解决方案,但没有一个能带来预期的结果,所以我不得不将其作为一个不同的问题发布。

1 个答案:

答案 0 :(得分:3)

您正在更新&#34; timeInterval&#34;匿名函数末尾的参数,虽然该语句没有任何问题但它没有任何好处 - 它会更新&#34; timeInterval&#34; 参数,而不是&#34; timeInterval&#34;循环外的变量。你可以做一个替代方案:

for(var i=0;i<ids.length;i++) {
    var timeInterval = (i + 1) * 1000;
    (function(i,timeInterval){
        setTimeout(function(){
            var link = document.createElement('a');
            link.href= "http://website.com/download/"+ids[i];
            var e = document.createEvent('MouseEvents');
            e.initEvent('click', true, true);
            link.dispatchEvent(e);
            console.log(ids[i]);
            console.log(timeInterval);
        }, timeInterval);
    })(i,timeInterval);
}

只是在匿名函数之外进行计算。

编辑 - 请注意,您可能仍会遇到问题,具体取决于运行此代码的上下文。浏览器可能不喜欢这种行为。