JavaScript中的事件循环&消息队列

本文介绍了JavaScript中的事件循环和消息队列机制,解释了单线程的JavaScript如何处理异步任务。事件循环在执行栈为空时,会从消息队列中取出任务执行。宏任务和微任务是异步处理的重要概念,微任务在当前宏任务执行完毕、渲染页面之前执行。举例说明了事件循环的工作流程和宏任务、微任务的执行顺序。
摘要由CSDN通过智能技术生成

title: JavaScript中的事件循环&消息队列

作为一门设计初衷为了处理浏览器网页交互(DOM操作、UI动画等)的语言,JavaScript只能被设计为单线程(否则多个线程同时处理DOM那将会造成混乱)。

可是写过JavaScript代码的人都用过定时器、ajax、事件绑定等。如果是单线程那岂不是无法完成这些异步请求?

一. 前言

其实,JavaScript单线程指的是浏览器中负责解释和执行JavaScript代码的只有一个线程——**JavaScript引擎线程。**除了他之外浏览器还有其他四个线程:

  • 事件触发线程
  • 定时器触发线程
  • 异步http请求线程
  • GUI渲染线程

当遇到计时器、DOM事件监听或是网络请求时,JS引擎会将其交给webapi,也就是浏览器提供的相应线程。而JS引擎则继续后边的其他任务,以此方式实现异步非阻塞。

在此咱们不得不讲一下setTimeoutsetInterval)函数。这东西没咱们想象的那么准,原因就在于当事件结束后他会将相应的回调函数(callback)交还给 消息队列。而消息队列中排列着其他的任务,只有轮到它才会被执行。所以setTimeout只能保证其在ms毫秒 之后 执行。

二. 事件循环与消息队列

2.1 什么是消息队列

众所周知JavaScript中的存储区域分为堆区、栈区、还有消息队列区。

  • 堆区存放用户创建的对象。(内训泄露定位的主要区域也在这里。)
  • 栈区则是用来处理函数执行(所以又称为执行栈)。每嵌套一层向栈中推入函数信息,得到返回值后出栈。主代码块依次进入执行栈,依次执行。
  • 而消息队列则是用来处理异步任务。每当出现异步调用事件时都会将其入队,执行完毕后再由任务队列通知主线程,让JS引擎接管此事件。
2.2 什么是事件循环
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值