这段代码的执行顺序,根据执行顺序分析、JS事件轮询原理
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
执行逻辑
- 从代码执行角度来看 首先分析同步代码、在面的代码中异步代码只有promise.then回调与settimeout回调,所以他们肯定是最后执行的、其他同步代码按照书写顺序自上向下执行
- promise.then回调虽然是异步执行,但是resolve()触发后实际上回调函数被加入到了js同步函数队列末尾,在轮询过程中仍然会作为同步代码优先执行
- settimeout定时器在js中是由一个单独模块管理、其回调函数也是由一个单独队列管理,在js同步队列执行完毕,才会执行定时器队列代码
结论
- 在js中代码的执行实际上是由两个队列来组织代码执行时序的(主线程队列、定时器队列),优先轮询主线程队列、主线程队列空闲轮询定时器队列。
- 实际上我们全局代码也在一个全局函数中,此函数在js解释器开始工作时,总是排在主线程队列头部。