JS事件循环/宏任务/微任务理解

JS事件循环/宏任务/微任务理解

前段时间做了一道题,涉及到异步的执行,事件的处理,早期也只是粗略看过一些,没有详细去学习,导致做错了:( 现在来好好学一学

1.前言

当时的题目是:

1
2
3
4
5
6
7
console.log('start')
var temp = true
setTimeout(() => {
temp = false
}, 1000)
while(temp){}
console.log('end')

问:end会不会输出,为什么?

我的回答是会,当时的想法是JS执行完同步任务之后,处理异步任务,能够跳出while循环,然后打印end

结果是错的!

下面学习下JS对于事件的处理机制,学习自JS事件循环机制(event loop)之宏任务/微任务

2.学习

事件处理

2.1 JS对于同步任务的处理

  • 同步任务直接进入主线程运行

2.2 JS对于异步任务的处理

  • 异步任务进入Event Table并注册回调函数
  • 指定事件完成时,将函数移入Event Queue
  • 当主线程的任务执行完毕后,会从Event Queue读取对应的函数,进入主线程

2.3 上述过程的重复执行构成了事件循环机制

3.反思

回过头来看,同步任务while进入主线程执行后并不会空闲,导致并不能从Event Queue中读取任务来执行,所以并不会打印end

4.更多

更细致的来看微任务(MicroTask)、宏任务(MacroTask)的概念

宏任务/微任务

emmmm.反正没人看,有空了接着记录一下