今天碰到一个很经典js执行顺序的题 代码不是很长
问的是console.log的输出顺序
这道题涉及到的知识点还挺多的
async function async1() {
console.log("async1start");
await async2();
console.log("async1end");
}
async function async2() {
console.log('async2')
}
console.log("scriptstart");
setTimeout(function () {
console.log("settimeout");
}, 0)
async1()
new Promise(function (resolve) {
console.log("promise1");
resolve();
}).then(function () {
console.log("promise2");
});
console.log('script end');
scriptstart
async1start
async2
promise1
script end
async1end
promise2
settimeout
js 单线程的 它会先执行一些同步操作 所以先输出的就是scriptstart
然后是async1start async声明的函数虽然执行异步 但是他也是属于同步的写法
和async同时出现的await 会强迫其他代码等待自己执行完之后再执行 所以第三个输出async2
然后再继续 输出 promise1和script end
async1end最后一个同步代码输出完毕
剩下的就是promise的.then里边的异步 和 settimeout 这里涉及到异步的宏任务和微任务 settimeout 属于宏任务,promise属于微任务
主线程执行完了之后先从微任务栈里面获取微任务执行,没有微任务了,就去宏任务栈里面获取宏任务执行,所以在一个循环内,微任务是比宏任务先执行的
所以setTimeout在最后被执行
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?