eventloop的机制/微任务/宏任务

EventLoop机制

事件循环机制

javascript是一个单线程的语言

任务类型

image-20230324212420802

执行顺序

  1. JS是从上到下一行一行执行。

  2. 如果某一行执行报错,则停止执行下面的代码。

  3. 先执行同步代码,再执行异步代码(先执行微任务,在执行宏任务

    微任务>Dom渲染>宏任务

EventLoop过程

  1. 同步代码,一行一行放入Call Stack中执行
  2. 遇到异步,会先“记录”下,等待执行时机(setTimeout,Ajax),时机到了,将之前“记录”的代码放入Callback Queue
  3. 当Call Stack为空(也就是同步代码执行完之后),EventLoop开始工作
  4. EventLoop轮询查找Callback Queue中是否有可执行的代码。如果有,将代码移动到Call Stack中执行
  5. EventLoop如果没有找到可以执行的代码,则会继续轮询查找

image-20230324214046950

微任务/宏任务/DOM渲染

  • 微任务是由ES6语法规定的
  • 宏任务是由浏览器规定的

image-20230324215035715

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div style="width: 100px; height: 100px; background: red;" ></div>
</body>
<script type="text/javascript">
console.log("start");

setTimeout(() => {
alert("宏任务"); // alert有阻塞DOM运行的效果
console.log("倒计时定时间器--宏任务")
},0)

Promise.resolve().then(() => {
alert("微任务");
console.log("Promise---微任务")
})

console.log("end")
</script>
</html>

image-20230324214928829

image-20230324214942700

参考文章

https://juejin.cn/post/7196741149343105061

https://juejin.cn/post/6962806212660297758


eventloop的机制/微任务/宏任务
http://example.com/2023/03/24/07.前端小课堂/03.eventloop的机制/
作者
Deng ErPu
发布于
2023年3月24日
许可协议