打印出0~4我能想明白,为什么会最后一行打印的是5呢?5是什么时候传入的const tasks = []; // 这里存放异步操作的 Promiseconst output = (i) => new Promise((resolve) => { setTimeout(() => { console.log(new Date, i); resolve(); }, 1000 * i);});// 生成全部的异步操作for (var i = 0; i < 5; i++) { tasks.push(output(i));}// 异步操作完成之后,输出最后的 iPromise.all(tasks).then(() => { setTimeout(() => { console.log(new Date, i); }, 1000);});
4 回答
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
喵喔喔
TA贡献1735条经验 获得超5个赞
使用var声明的变量是没有局部作用域的概念,只有函数作用域。
for (var i = 0; i < 5; i++) {
tasks.push(output(i));
}
// 异步操作完成之后,输出最后的 i
Promise.all(tasks).then(() => {
setTimeout(() => {
console.log(new Date, i);
}, 1000);
});
这种写法和下面的写法是一样的效果:
var i = 0
for (; i < 5; i++) {
tasks.push(output(i));
}
// 异步操作完成之后,输出最后的 i
Promise.all(tasks).then(() => {
setTimeout(() => {
console.log(new Date, i);
}, 1000);
});
因为i是在最外层作用域的,而then中的回调是在所有promise都resolve之后才执行的,这是 i 已经被赋值为5,所以输出5.
如果使用let声明i,你就会看到报错的情况
添加回答
举报
0/150
提交
取消