JAVAScript是单线程的语言,也就是说同一时间只能进行一个任务,毕竟JavaScript可以操作dom,进行ui交互,删除dom和修改dom同时进行,那么应该听哪一个? 。
正是因为这样,决定了它是单线程的,但是又说单线程只能在同一个时间内执行一个任务,这样岂不是会造成阻塞?前一个任务执行很久,后面都卡死了,所以就需要JavaScript的事件循环机制来进行分配,这样就会被分为
宏任务:当前调用栈执行的代码称为宏任务宏任务有哪些?
- 主代码块
- 定时器 setTimeout、setInterval、setImmediate
- 同步代码
- I/O
- promise.then
- nextTick
- process
- Object.observe、MutationObserve
- catch finally
console.log('1');setTimeout(function() {console.log('2');}, 0);Promise.resolve().then(function() {console.log('3');}).then(function() {console.log('4');});console.log('5');
执行结果:1 5 3 4 2先了解一下运行机制:
1. 在执行栈中执行一个宏任务(程序刚开始执行时,会把整个代码当成第一个宏任务) 。
2. 执行的过程中遇到微任务,先将微任务添加到微任务队列中(它是属于本次执行的宏任务中分出来微任务),遇到宏任务,放到下一个执行栈中 。
3. 当前宏任务执行完毕,立即执行任务队列(先进先出的原则)中的微任务
4. 当前微任务队列中的任务执行完毕
5. 接着开始执行执行栈中的下一个宏任务,
6. 依次循环这个规律
解析上面的代码:
1. 整体代码被当成第一个宏任务,代码从上到下执行
2. 遇到console.log('1');是同步任务,直接执行,输出1
3. 遇到setTimeout,是宏任务,放到执行栈中
4. 再往下执行,遇到promise,promise的执行器里是立即执行的,这里没有执行器,而是有then,then是微任务,先放到本次宏任务的微任务队列中,then后面返回的也是一个promise,第二个then也是一个微任务,放到微任务队列中 。
5.接着遇到同步代码console.log('5');直接输出5,这时候,第一轮宏任务执行完毕
6.需要去执行本轮它产生的微任务,先进先出的原则,输出3 4
7.这时候循环的第一周期就结束了
8.再去执行栈中的第二个宏任务,输出 2
推荐阅读
- 喝茶为什么要茶具,喝茶的境界
- 皇菊花茶的功效与禁忌,菊花茶的禁忌与功效作用
- 一次完整的JVM堆外内存泄漏故障排查记录
- 监控Redis?使用Grafana的Source插件轻松搞定
- 大浪淘沙的古诗原文 浪淘沙借问长江与海水古诗
- 荀攸是荀彧的什么人 荀彧为曹操出的第一个计谋是
- 房子大了,设备多了,家里的WiFi网络该怎么优化?
- 安史之乱有多吓人 安禄山怎么死的(安禄山叛乱为什么失败)
- 在日本的中国文物 日本有哪些中国失传的古籍
- 汉朝的都城分别在哪里 汉朝首都在哪个城市