事件循环(event loop)

1.事件循环是什么?为什么有事件循环?

简单来讲是指浏览器或者Node的一种解决Js单线程运行时不会让线程阻塞的一种机制。 

JavaScript是单线程,也就是说每次只能执行一项任务,其他任务必须按照顺序等待执行,只有当前任务执行之后才能执行下一个任务,但是一些高耗时的任务就可能会阻塞进程,为了协调事件用户交互,脚本、UI渲染和网络处理等行为,用户引擎必须使用事件循环(event loops)

1.1浏览器线程:

  1. GUI 渲染线程: GUI线程负责渲染页面,加载Html、Css构成页面Dom树,当页面发生重绘或者由于某些原因导致页面回流都会调起该线程。该线程和JS引擎互斥,当Js引擎工作时,GUI线程被挂起,GUI更新加到Js任务等待队列,等待Js引擎线程空闲时执行。
  2. Js引擎线程:Js是单线程,一次只能执行一项任务,和GUI线程互斥,当Js线程运行时间过长则会造成页面阻塞。
  3. 事件触发线程:当事件符合事件触发条件时,会将对应的事件回调函数添加到任务队列的队尾Js引擎处理。
  4. 计时器触发线程:由于Js引擎可能会发生阻塞,所以不是由Js引擎来计时的。开启定时器触发线程开始计时,计时结束后添加到任务列表等待Js引擎处理
  5. http请求线程:当Http发起请求并返回结果时,将回调函数添加到任务队列等待Js引擎处理。

1.2事件循环

当执行栈中的同步任务都执行完毕后,栈中的任务被清空了,就去任务队列中按照顺序读取一个任务放入栈中执行 。每次栈内被清空都会去任务队列确认是否有任务,有就读取,加入栈中执行,每次都循环读取-执行的操作,就形成了事件循环。

  • 执行栈:Js执行栈是先进后出的数据结构,所有任务都会被放入执行栈中等待主线程来执行,当函数被调用时,会被添加到栈中的顶部,完成后从顶部移除,直到栈被清空。
  • 同步任务与异步任务:任务队列是先进先出的数据结构。同步任务会在调用栈中按照顺序被执行,而异步任务会等待异步结果返回之后将注册的回调函数添加到任务等待队列,等主线程空闲的时候被执行。

仅供个人学习,如有错误,恳求指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值