js代码的执行顺序

19 阅读1分钟

浏览器中的JavaScript脚本执行过程

  • a. JavaScript脚本进入主线程, 开始执行

  • b. 执行过程中如果遇到宏任务和微任务,分别将其挂起,只有当任务就绪时将事件放入相应的任务队列

  • c. 脚本执行完成,执行栈清空

  • d. 去微任务队列依次读取事件,并将相应的回调函数放入执行栈运行,如果执行过程中遇到宏任务和微任务,处理方式同 b, 直到微任务队列为空

  • e. 浏览器执行渲染动作, GUI渲染线程接管,直到渲染结束

  • f. JS线程接管,去宏任务队列依次读取事件,并将相应的回调函数放入执行栈, 开始下一个宏任务的执行,过程为b -> c -> d -> e -> f, 如此循环

  • g. 直到执行栈、宏任务队列、微任务队列都为空,脚本执行结束

案例


setTimeout(() => {

console.log(1)

}, 0)

console.log(4)

new Promise(function(resolve) {

console.log(2);

resolve();

}).then(function() {

console.log(3);

})

先执行 setTimeout ,定时器为宏任务先给挂起;然后继续往下执行 console.log(4) 然后执行 promise 中的代码 console.log(2);接着遇到了微任务 promise.then 给挂起。到此,主任务执行完毕,接着去微任务队列,执行 console.log(3),发现微任务队列执行完毕。然后去执行宏任务队列, console.log(1)。

结果: 4 2 3 1


setTimeout(() => {

console.log(1)

}, 0)

new Promise(function(resolve) {

console.log(2);

resolve();

}).then(function() {

console.log(3);

})

console.log(4)

结果 2 4 3 1