问题描述:当我们使用for循环时,里面执行异步操作(比如延时器,接口请求等等),就会出现里面执行的永远是最后一次循环的结果,原因是因为for循环是同步的,当异步操作还没走完,for循环已经全部执行完成了,所以得到的永远是最后一次的结果。
解决办法1(闭包):
通过闭包来保存每次循环的执行状态
for (var i = 0; i < 5; i++) {
(function(a){
setTimeout(function(){
console.log(a)
},1000);
}(i))
}
方法二(ES6的let定义变量)
因为使用let定义变量有块级作用域,每个for循环的变量只对本次循环有效
for (let i = 0; i < 8; i++) {
setTimeout(function() {
console.log('第' + (i + 1) + '次循环')
}, 1000)
}
for循环中的递归调用实现阶乘级数据:
// 接口保存数据
setMark() {
for (var i = 0; i < 5; i++) {
this.fn(i, 5)
}
},
// 保存数据方法
saveMarkData() {
for (let i = 0; i < 8; i++) {
setTimeout(function() {
console.log('第' + (i + 1) + '次循环')
}, 1000)
}
},
打印结果: