4 回答

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

TA貢獻(xiàn)3593條經(jīng)驗(yàn) 獲得超1個(gè)贊

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

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