您的位置:首页 > Web前端 > JavaScript

谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务?

2020-07-22 21:20 1066 查看
1.javascript为什么是单线程?

与javascript的设计初衷有关,最早javascript是运行在浏览器中的脚本语言,目的是为了实现页面上的动态交互,实现页面的核心是dom操作,所以决定了javascript是单线程,否则会出现

线程同步
的问题:

比如多个线程同时操作一个dom元素,这时浏览器不知道要以谁的操作为准,造成代码执行顺序混乱

javascript是单线程也就意味着浏览器有多个任务的时候要排队依次进行,一个一个完成,这种模式的优点是比较安全。缺点是如果我们遇到一个特别消耗时间的任务,那么后面的任务就会一直等着这个任务的完成,这样会造成页面卡死的情况,会造成阻塞。

javascript语言无法处理大量的耗时任务,为了解决这个问题,javascript讲执行任务分成了两种模式:

同步模式
异步模式

2.同步模式

同步模式指的是我们的javascript代码要依次执行,后面的代码要等待前一句代码执行完成才能执行,排队执行,javascript代码大多数是以

同步模式
进行执行的

3.异步模式

异步模式指的是我们的javascript代码

不会等待
前面的代码执行完毕才开始执行。

我们将执行的代码放入到调用栈中执行,如果是同步的直接执行,如果是异步的则放入

消息队列
中等待执行,等到所有的代码执行完毕,我们的
event loop
就上场了,它会监听
调用栈
消息队列
中的任务,当调用栈中所有的任务结束以后,它会从
消息队列
中依次取出回调函数压入到调用栈,开始执行,直到整个循环结束

4. Event Loop

主线程从

消息队列
中读取事件,这个过程是循环不断的,所以整个的这种运行机制称为Event Loop(事件循环),
Event Loop是javascript的执行机制

5. 消息队列

消息队列是暂时存放异步任务的地方,我们的异步代码会存放到消息队列中,等到同步代码执行完毕以后,event loop会从消息队列中依次取出异步任务放到调用栈中再次执行。

6.宏任务,微任务

宏任务:当前调用栈中执行的代码成为宏任务,包括 主代码快定时器
微任务:宏任务执行完,在下一个宏任务

开始之前
需要执行的任务,可以理解为
回调函数

运行机制:

  1. 在执行栈中执行一个宏任务
  2. 执行过程中遇到微任务,将微任务添加到消息队列中
  3. 当前宏任务执行完毕,立即执行微任务队列中的任务
  4. 微任务执行完毕后,把下一个宏任务放到消息队列中,通过eventloop放到调用栈中执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: