在for循环的jQuery推迟行为(jQuery deferred behaviour in for

2019-08-02 18:45发布

最近,我问了一个有关的jQuery的推迟循环的行为问题。 这里链接

我收到一个工作的答案,但我不明白为什么它的工作原理。

如果我有以下代码:

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() {});
})();​

它通过对4返回与值0 5个警告窗口如果我改变updateElements方法:

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

它返回只值4 5个警告窗口。 可能有人请解释这种现象? 我努力理解区别在哪里来的。

谢谢!

Answer 1:

它确实是其原因是因为你已经关闭了与环

(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
 }
};


文章来源: jQuery deferred behaviour in for loop