Java loop机制_JavaScript运行机制—EventLoop

什么是EventLoop?

js为什么是单线程

js采用单线程,和js的用途相关,js主要是用来操作浏览器中的dom元素;

想象一下,如果js是多线程,不同的线程对同一个dom进行操作,一方面会增加浏览器渲染的复杂度;另一方面会造成浏览器的混乱,不知道如何是好😭

所以js采用单线程的方式,之后也不会进行改变

复制代码

任务队列

单线程的执行方式,意味着所有的任务都会在同一个主线程上面进行排队执行,形成了任务队列

js代码可以分为同步与异步代码,所以相应的会形成同步任务与异步任务,所谓的异步不会阻塞主线程,会等主线程的任务完成之后,再行执行

EventLoop

浏览器为了提高效率,模拟多线程管理方式,在同步任务执行完毕之后,通过EventLoop方式获取异步任务执行,就形成了EventLoop

主执行栈

338668df0c18774c585e1a6522d270ba.png

如图所示,js中的内存分为 堆内存(heap) 和 栈内存(stack), 堆内存 中存的是我们声明的object类型的数据,栈内存中存的是基本数据类型以及 函数执行时的运行空间。我们的同步代码就放在执行栈 中,即主执行栈;那异步代码呢?浏览器会将 dom事件 ajax setTimeout等异步代码放到队列中,等待执行栈中的代码都执行完毕,才会执行队列中的代码。

异步队列

异步代码存放的队列,但异步队列的执行也分为宏任务与微任务

宏任务

宏任务包括setTimeOut、setInterval

等待执行栈和微任务队列都执行完毕才会执行,并且在执行完每一个宏任务之后,会去看看微任务队列有没有新添加的任务,如果有,会先将微任务队列中的任务清空,才会继续执行下一个宏任务

微任务

微任务包括Promise

当执行栈中的代码执行完毕,会在执行宏任务队列之前先看看微任务队列中有没有任务,如果有会先将微任务队列中的任务清空才会去执行宏任务队列

代码执行的次序为:主执行栈 > 微任务 > 宏任务

举个🌰

setTimeout(() => {

console.log('timeout1')

Promise.resolve().then(() => {

console.log('promise1')

})

Promise.resolve().then(() => {

console.log('promise2')

})

}, 100)

setTimeout(() => {

console.log('timeout2')

Promise.resolve().then(() => {

console.log('promise3')

})

}, 200)

复制代码

输出结果:timeout1 promise1 promise2 timeout2 promise3

nodejs的EventLoop

nodejs中的执行机制,和上述浏览器中的执行机制有差异;和node的版本也有关系,等着下次再进行学习

参考链接

www.ruanyifeng.com/blog/2014/1…

juejin.im/post/5b63b4…

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[JavaScript运行机制—EventLoop]http://www.zyiz.net/tech/detail-142391.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值