嗶嗶one
2019-03-14 13:12:50
打印出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
提交
取消