這段代碼的執(zhí)行順序姑宽,根據(jù)執(zhí)行順序分析遣耍、JS事件輪詢?cè)?/h4>
console.log('script start'); // 1
setTimeout(function () {
console.log('settimeout') // 6
});
let promise1 = new Promise(function (resolve) {
console.log('promise1') // 2
resolve()
console.log('promise1 end') // 3
}).then(function () {
console.log('promise2') // 5
});
console.log('script end'); // 4
執(zhí)行邏輯
- 從代碼執(zhí)行角度來(lái)看 首先分析同步代碼、在面的代碼中異步代碼只有promise.then回調(diào)與settimeout回調(diào)炮车,所以他們肯定是最后執(zhí)行的舵变、其他同步代碼按照書寫順序自上向下執(zhí)行
- promise.then回調(diào)雖然是異步執(zhí)行,但是resolve()觸發(fā)后實(shí)際上回調(diào)函數(shù)被加入到了js同步函數(shù)隊(duì)列末尾瘦穆,在輪詢過程中仍然會(huì)作為同步代碼優(yōu)先執(zhí)行
- settimeout定時(shí)器在js中是由一個(gè)單獨(dú)模塊管理纪隙、其回調(diào)函數(shù)也是由一個(gè)單獨(dú)隊(duì)列管理,在js同步隊(duì)列執(zhí)行完畢难审,才會(huì)執(zhí)行定時(shí)器隊(duì)列代碼
結(jié)論
- 在js中代碼的執(zhí)行實(shí)際上是由兩個(gè)隊(duì)列來(lái)組織代碼執(zhí)行時(shí)序的(主線程隊(duì)列瘫拣、定時(shí)器隊(duì)列),優(yōu)先輪詢主線程隊(duì)列告喊、主線程隊(duì)列空閑輪詢定時(shí)器隊(duì)列麸拄。
- 實(shí)際上我們?nèi)执a也在一個(gè)全局函數(shù)中,此函數(shù)在js解釋器開始工作時(shí)黔姜,總是排在主線程隊(duì)列頭部拢切。
console.log('script start'); // 1
setTimeout(function () {
console.log('settimeout') // 6
});
let promise1 = new Promise(function (resolve) {
console.log('promise1') // 2
resolve()
console.log('promise1 end') // 3
}).then(function () {
console.log('promise2') // 5
});
console.log('script end'); // 4