4 回答

TA貢獻5條經(jīng)驗 獲得超3個贊
如果想要依次次輸出,0,1,2,3,4,5,用不用閉包都可以實現(xiàn)。
主要有兩點要注意: 1. 作用域。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2. setTimeout的運行機制。

TA貢獻3593條經(jīng)驗 獲得超0個贊

TA貢獻19條經(jīng)驗 獲得超17個贊
關鍵問題是js引擎是單線程的,所以所以并不存在真正意義上的異步,它所謂的異步就是不同步。setTimeout是js的異步表現(xiàn)之一,js所有異步都會入隊。任務隊列只有在主線程執(zhí)行完了才會去執(zhí)行任務隊列,所以你這個先輸出主線程‘other actions’,再輸出i==0時的那個6,然后輸出‘1秒后打印出來’(這可不是1秒而是你主程結束處理完隊列中排在他前面的任務后立馬打印所以時間不確定例如你other actions底下寫一個死循環(huán)那個6和它就永遠不會打印),最后每隔1s輸出那5個6,如果你把i*1000改為0就是同時輸出那6個6然后輸出‘1秒后打印出來’這是因為隊列和棧不一樣它是先進先出。
棧是一種數(shù)據(jù)結構表現(xiàn)為后進先出!
關于執(zhí)行上下文
1.只有唯一的一個全局上下文window
2.函數(shù)的執(zhí)行上下文的個數(shù)沒有限制
3.每次某個函數(shù)被調(diào)用,就會有個新的執(zhí)行上下文為其創(chuàng)建,即使是調(diào)用的自身函數(shù),也是如此。

TA貢獻358條經(jīng)驗 獲得超213個贊
這個是閉包問題。你理解錯了,這樣寫就好了
for (var i = 0; i < 4; i ++) {
? ?setTimeout((function(i) {
? ? ? ?return function() {
? ? ? ? ? ?console.log(i);
? ? ? ?}
? ?})(i), i * 1000)
}
添加回答
舉報