二露
2017-07-16 21:00:41
我想知道這段代碼是怎么執(zhí)行的以及一次性定時器的特點var i=0; for(i=0;i<3;i++){ ? ? console.log(i) ? ? setTimeout(function() { ? ? ? ? return function() { ? ? ? ? ? ? console.log(i) ? ? ? ? } ? ? }(),0) }
1 回答

李曉健
TA貢獻(xiàn)1036條經(jīng)驗 獲得超461個贊
這段代碼會輸出 1 2 3 3 3 3 ,前面輸出的 1 2 3,就是for循環(huán)里面直接輸出的結(jié)果。然后來說說這個定時器里的東西:這個setTimeout里你第一個參數(shù)傳的是一個立即執(zhí)行函數(shù),也就是說當(dāng)js解析器讀到這段代碼時就會立即執(zhí)行,而你這個function里又會返回一個函數(shù),所以
????setTimeout(function()?{ ????????return?function()?{ ????????????console.log(i) ????????} ????}(),0) ????//就相當(dāng)于 ????setTimeout(function()?{ ????????console.log(i) ????},0)
這兩種寫法效果是一樣的。然后你第二個參數(shù)是0,大概意思也就是讓定時立即執(zhí)行,但是js是單線程執(zhí)行的,定時器又會被加入到執(zhí)行隊列的最后,即使你給的定時時間是0,他也會等到主線程的東西執(zhí)行完,再來執(zhí)行,for又是同步執(zhí)行,他在主線程里,所以setTimeout里面的內(nèi)容就要等到for循環(huán)執(zhí)行完才能執(zhí)行,當(dāng)for循環(huán)執(zhí)行完的時候,i就已經(jīng)是3了,for循環(huán)里的定時函數(shù)也需要執(zhí)行3次,所以后面就連著3個3,并且地for循環(huán)里的1 2 3 輸出之后才輸出。
如果你的問題已解決,請記得采納答案!
點擊展開后面2條
添加回答
舉報
0/150
提交
取消