两者的主要区别是什么:
var test=[5,6,7,8,9];
$.each(test, function (i, num) {
setTimeout(function(){console.log('i: '+i+' '+num)},500);
});
for (var j = 0; j < test.length; j++) {
setTimeout(function(){console.log('j: '+j+' '+test[j])},500);
}
第一个循环输出:
i: 0 5
i: 1 6
i: 2 7
i: 3 8
i: 4 9
第二个循环输出:
5次'j:5未定义'
我理解为什么第二个循环会这样做,但不明白为什么 $.each “按预期”工作
谢谢!
最佳答案
在第一个片段的幕后,对于每次迭代,您提供的回调都会被调用。这意味着,它会在内部为每次迭代创建一个范围。最终变成了一个 cloure。
但是在第二个片段中。当超时回调被触发时,将使用初始范围。所以它正在显示该输出。您可以使用以下代码使其工作,
for (var j = 0;j<test.length-1;j++) {
var scope = function(i) {
setTimeout(function(){console.log('j: '+i+' '+test[i])},500);
};
scope(j);
}
关于javascript - jquery $.each 与 for 循环(具有异步内容),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33395172/