js单线程,事件循环,微宏任务

JavaScript中的单线程

   JavaScript是单线程脚本语言。
   所以,在一行代码的执行过程过,必然不会执行另一行代码的,就行你在使用了alert(1)以后在后面疯狂的console.log(),如果执行到 alert(1),你没有关闭这个弹窗,后面的console.log()是永远都不会执行的,因为 alert() 这个任务还没有执行完成,下面的代码没法执行。

事件循环 eventloop

事件循环:先运行macroTask(宏任务)队列中的一个,然后运行microTask(微任务)队列中的所有任务。接着开始下一次循环。

那什么是宏任务,什么又是微任务呢?

   比如:
打饭的例子,你要打饭这件事请就是宏任务。这是一个大的事件。当轮到你打饭的时候,事件执行到你这里了,这个时候阿姨开始给你打饭,后面的同学还在等待着。但是你去打饭不单单的就是打饭,你会询问每种菜是什么,价格是多少,有没有XXX菜,有没有汤一样,那这些询问可以比作是微任务。当你的宏任务与微任务都执行完成了,相当于你的这一轮时间执行完成,这个时候开始执行下一轮事件,也就是下一个同学开始打饭了。同样的,下面的一轮循环中也可能存在微任务。

宏任务

  • 创建主文档对象,解析HTML,执行主线或者全局的javascript的代码,更改url以及各种事件。

  • 页面加载,输入,网络事件,定时器。从浏览器角度看,宏任务是一个个离散的,独立的工作单元。

  • 运行完成后,浏览器可以继续其他调度,重新渲染页面的UI或者去执行垃圾回收 一些异步任务的回调会以此进入 macrotask queue(宏任务队列),等等后续被调用,这些异步函数包括:

  • setTimeout

  • setInterval

  • setImmediate (Node)

  • requestAnimationFrame (浏览器)

  • I/O

  • UI rendering (浏览器)

微任务

  • 微任务是更小的任务,微任务更新应用程序的状态,但是必须在浏览器任务继续执行其他任务之前执行,浏览器任务包括重新渲染页面的UI。

  • 微任务包括Promise的回调函数,DOM发生变化等,微任务需要尽可能快地,通过异步方式执行,同时不能产生全新的微任务。

  • 微任务能使得我们能够在重新渲染UI之前执行指定的行为,避免不必要的UI重绘,UI重绘会使得应用状态不连续 另一些异步回调会进入 microtask queue(微任务队列) ,等待后续被调用,这些异步函数包括:

  • process.nextTick (Node)

  • Promise.then()

  • catch

  • finally

  • Object.observe

  • MutationObserver

这里有一点需要注意的:Promise.then() 与 new Promise(() => {}).then() 是不同的,前面的是一个微任务,后面的 new Promise() 这一部分是一个构造函数,这是一个同步任务,后面的 .then() 才是一个微任务,这一点是非常重要的。

简单总结

JS是单线程的,它是通过事件循环机制来实现异步的。

首先是主线程执行当前栈中的任务,遇到同步任务继续执行,遇到异步任务会将其放入Event Tables的事件队列中。Event Tables的事件队列又分为两类,一类是宏任务,一类是微任务。
当主线程的任务执行完毕后,回去任务队列中取出任务来执行。此时会优先选取任务队列中的为任务,执行完微任务后,才会去取宏任务执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值