Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
for循环中的jQuery延迟行为_Jquery_Jquery Deferred_Deferred - Fatal编程技术网

for循环中的jQuery延迟行为

for循环中的jQuery延迟行为,jquery,jquery-deferred,deferred,Jquery,Jquery Deferred,Deferred,我最近问了一个关于jquery在for循环中延迟的行为的问题 我收到了一个有效的答案,但我不明白为什么它有效 如果我有以下代码: function update(callbacks) { return $.Deferred(function(dfr) { setTimeout(function() { callbacks.success() }, 1000); dfr.resolve(); }).promis

我最近问了一个关于jquery在for循环中延迟的行为的问题

我收到了一个有效的答案,但我不明白为什么它有效

如果我有以下代码:

function update(callbacks) {
    return $.Deferred(function(dfr) {
        setTimeout(function() {
            callbacks.success()
        }, 1000);
        dfr.resolve();
    }).promise();
}

function updateElements(deferreds) {
    for (var i = 0; i < 5; i++) {
        (function() {
            var index = i;
            deferreds.push(update({
                success: function() {
                    alert(index);
                }
            }));
        })();
    }
};

(function() {
    var deffereds = [];
    updateElements(deffereds);
    $.when.apply($, deffereds).then(function() {}, function() {});
})();​
函数更新(回调){
返回延迟的美元(函数(dfr){
setTimeout(函数(){
callbacks.success()
}, 1000);
dfr.resolve();
}).promise();
}
函数更新元素(延迟){
对于(变量i=0;i<5;i++){
(功能(){
var指数=i;
延迟。推送(更新)({
成功:函数(){
警报(索引);
}
}));
})();
}
};
(功能(){
var微分=[];
更新元素(不同);
$.when.apply($,reffereds).then(function(){},function(){});
})();​
它返回5个值为0到4的警报窗口。如果我将updateElements方法更改为:

function updateElements(deferreds) {
    for (var i = 0; i < 5; i++) {
        var index = i;
        deferreds.push(update({
            success: function() {
                alert(index);
            }
        }));
    }
};
函数更新元素(延迟){
对于(变量i=0;i<5;i++){
var指数=i;
延迟。推送(更新)({
成功:函数(){
警报(索引);
}
}));
}
};
它仅返回值为4的5个警报窗口。有人能解释一下这种行为吗?我正在努力理解差异是从哪里来的


谢谢

它这样做的原因是因为您已经用

(function() {
        var index = i;
        deferreds.push(update({
            success: function() {
                alert(index);
            }
        }));
})();
此自执行块将变为静态值,因为它没有传入外部值。正如在链接的答案中一样,您需要将该值传入。请注意关键区别,其中值在IEFE(立即执行的函数表达式)末尾给出。很抱歉,这需要强调

(function(VALUE_ACCEPTED){
  //VALUE_ACCEPTED accepts the passed value of VALUE_PASSED
})(VALUE_PASSED)
因此,您的代码如下所示:

function updateElements(deferreds) {
for (var i = 0; i < 5; i++) {
    (function(valueAccepted) { // valueAccepted = the passed in value from i
        var index = valueAccepted;
        deferreds.push(update({
            success: function() {
                alert(index);
            }
        }));
    })(i); // pass in i to valueAccepted
 }
};
函数更新元素(延迟){
对于(变量i=0;i<5;i++){
(函数(valueAccepted){//valueAccepted=从i传入的值
var指数=接受的价值;
延迟。推送(更新)({
成功:函数(){
警报(索引);
}
}));
})(i) ;//将i传递给valueAccepted
}
};

循环在几毫秒内运行,更新数字,由于延迟是异步的并等待,因此当它显示数字时,变量已更改,循环早就完成了。通过将其包装在匿名函数中,
索引
变量的值保持不变,不会更新,因为它是在每次迭代时设置的局部变量。的可能重复项