题目
一名同砚在for
轮回里一连发送了4个ajax
要求,然后在success
的回调函数里运用了自增变量i
,然则i
值并不总能到达他的准确希冀,常常出现题目。
我把这个题目同理形貌为setTimeout
的运用:
// 代码一
for (var i = 0; i < 4; i++) {
setTimeout(function(){
console.log(i);
}, 0);
}
// 输出结果以下
// 4
// 4
// 4
// 4
缘由
JavaScript是单线程实行的,setTimeout
函数会被放到使命行列里守候实行(纵然守候时间为0),当for
轮回实行完以后,i
的值已变成了 4
ajax
要求的回调函数也是如许,加上同时发送多个要求,它们的返回递次也并不老是和发送递次一致。
解决方法
把setTimeout
或ajax
部份抽离成一个函数,然后传值调用它。如许在函数里会保留i
的一个副本,从而保证和希冀结果一致。
// 代码二
function callback(temp){
setTimeout(function(){
console.log(temp);
}, 0);
}
for (var i = 0; i < 4; i++) {
callback(i);
}
// 输出结果以下
// 0
// 1
// 2
// 3