請說明以下程式碼會輸出什麼,以及盡可能詳細地解釋原因。
for(var i=0; i<5; i++) {
console.log('i: ' + i)
setTimeout(() => {
console.log(i)
}, i * 1000)
}
i: 0
i: 1
i: 2
i: 3
i: 4
5
5
5
5
5
- 將 for 迴圈放入 Call Stack 並開始執行,宣告變數 i = 0,判斷 i 是否小於 5,是,進入第一圈迴圈
- 將
console.log('i: ' + 0)
放入 Call Stack 並直接執行,印出 i: 0 - 將
setTimeout(() => { console.log(0) }, 0 * 1000)
放入 Call Stack,透過 Web API,在瀏覽器設定計時器為 0 ms,直到倒數結束,將() => { console.log(0) }
放到 Callback Queue 等待執行,setTimeout 執行結束後從 Call Stack 移除 - 第一圈迴圈結束,將 i + 1
- i = 1,判斷 i 是否小於 5,是,進入第二圈迴圈
- 將
console.log('i: ' + 1)
放入 Call Stack 並直接執行,印出 i: 1 - 將
setTimeout(() => { console.log(i) }, 1 * 1000)
放入 Call Stack,透過 Web API,在瀏覽器設定計時器為 1000 ms ,直到倒數結束,將() => { console.log(i) }
放到 Callback Queue 等待執行,setTimeout 執行結束後從 Call Stack 移除 - 第二圈迴圈結束,將 i + 1
- i = 2,判斷 i 是否小於 5,是,進入第二圈迴圈
- 將
console.log('i: ' + 2)
放入 Call Stack 並直接執行,印出 i: 2 - 將
setTimeout(() => { console.log(i) }, 2 * 1000)
放入 Call Stack,透過 Web API,在瀏覽器設定計時器為 2000 ms ,直到倒數結束,將() => { console.log(i) }
放到 Callback Queue 等待執行,setTimeout 執行結束後從 Call Stack 移除 - 第二圈迴圈結束,將 i + 1
- i = 3,判斷 i 是否小於 5,是,進入第三圈迴圈
- 將
console.log('i: ' + 3)
放入 Call Stack 並直接執行,印出 i: 3 - 將
setTimeout(() => { console.log(i) }, 3 * 1000)
放入 Call Stack,透過 Web API,在瀏覽器設定計時器為 3000 ms ,直到倒數結束,將() => { console.log(i) }
放到 Callback Queue 等待執行,setTimeout 執行結束後從 Call Stack 移除 - 第三圈迴圈結束,將 i + 1
- i = 4,判斷 i 是否小於 5,是,進入第四圈迴圈
- 將
console.log('i: ' + 4)
放入 Call Stack 並直接執行,印出 i: 4 - 將
setTimeout(() => { console.log(i) }, 4 * 1000)
放入 Call Stack,透過 Web API,在瀏覽器設定計時器為 4000 ms ,直到倒數結束,將() => { console.log(i) }
放到 Callback Queue 等待執行,setTimeout 執行結束後從 Call Stack 移除 - 第四圈迴圈結束,將 i + 1
- i = 5,判斷 i 是否小於 5,否,跳出迴圈,執行結束後從 Call Stack 移除
- 當 Event Loop 偵測到 call stack 為空時,依序將 Callback Queue 的任務丟到 Call Stack 執行
- 執行第一個
() => { console.log(i) }
,再執行console.log(i)
,在 function 的 EC 中找不到 i,往上一層 EC 找,找到 i = 5,印出 5,執行結束從 Call Stack 移除 - 執行第二個
() => { console.log(i) }
,再執行console.log(i)
,在 function 的 EC 中找不到 i,往上一層 EC 找,找到 i = 5,印出 5,執行結束從 Call Stack 移除 - 執行第三個
() => { console.log(i) }
,再執行console.log(i)
,在 function 的 EC 中找不到 i,往上一層 EC 找,找到 i = 5,印出 5,執行結束從 Call Stack 移除 - 執行第四個
() => { console.log(i) }
,再執行console.log(i)
,在 function 的 EC 中找不到 i,往上一層 EC 找,找到 i = 5,印出 5,執行結束從 Call Stack 移除 - 執行第五個
() => { console.log(i) }
,再執行console.log(i)
,在 function 的 EC 中找不到 i,往上一層 EC 找,找到 i = 5,印出 5,執行結束從 Call Stack 移除