首先,JavaScript是一个单线程的脚本语言。
所以就是说在一行代码执行的过程中,必然不会存在同时执行的另一行代码,就像使用alert()
以后进行疯狂console.log
,如果没有关闭弹框,控制台是不会显示出一条log
信息的。
亦或者有些代码执行了大量计算,比方说在前端暴力破解密码之类的鬼操作,这就会导致后续代码一直在等待,页面处于假死状态,因为前边的代码并没有执行完。
1. 微任务、宏任务
宏任务(macrotask)
- 异步 Ajax 请求
- setTimeout、setInterval
- 文件操作
- 其它宏任务
微任务(microtask)
- Promise.then、.catch 和 .finally
- process.nextTick
- 其它微任务
两个任务皆为 异步任务,区别就是执行顺序。消息队列 有微先走微,微可插宏队
2. 执行具体步骤顺序
先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中
遇到异步微任务则将异步微任务放入微任务队列中
当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行
微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。
3.面试题:请分析以下代码输出的顺序(代码较长,截取成了左中右 3 个部分)
正确的输出顺序是:156234789