for循环中的jQuery延迟行为
我最近问了一个关于jquery在for循环中延迟的行为的问题 我收到了一个有效的答案,但我不明白为什么它有效 如果我有以下代码: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
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
}
};
循环在几毫秒内运行,更新数字,由于延迟是异步的并等待,因此当它显示数字时,变量已更改,循环早就完成了。通过将其包装在匿名函数中,索引
变量的值保持不变,不会更新,因为它是在每次迭代时设置的局部变量。的可能重复项