• 0
  • 0
分享
  • JavaScript的事件循环机制详解——软件测试圈
  • 曼倩诙谐 2022-07-07 11:13:31 字数 1195 阅读 1654 收藏 0

  js是单线程的语言,单线程是指所有的程序路径按照一定的顺序执行,只有前面的程序执行了,后面的程序才会执行。

  也就是说在同一时间,js只能做一件事情,为了协调浏览器产生的各种事件、网络处理、前端渲染等行为,js的事件循环机制,即EventLoop应运而生。

  JavaScript是单线程的原因

  js的设计初衷是作为浏览器的脚本语言,浏览器中涉及到与用户互动、频繁操作DOM等动作,如果js设计为多线程,会有很复杂的线程同步问题,即使同步问题被解决,也会降低浏览器的响应效率,得不偿失,因此,JavaScript被设计为单线程保证浏览器动作的一致性。

  事件循环(EventLoop)

  JavaScript既然被设计为单线程,是如何做到异步的呢?这时就用到了JavaScript的事件循环机制。

  如下图所示为JavaScript事件循环的原理图。

1-1.png

  如图所示,事件循环是主线程循环读取任务队列中的任务,直到所有的任务都被执行。在事件循环中,JavaScript用到了栈、堆以及队列等数据结构。

  栈中存放的是执行上下文,有函数被调用时,就会创建上下文存放在执行栈中。

  堆中表示一个非结构化的内存区域,用来存放对象。队列是指任务队列,用于存放异步任务。

  js引擎遇到一个异步事件之后不会一直等待事件的返回结果,而是将事件挂起,继续执行执行栈中的其他任务。

  当异步事件返回结果时,js将异步事件callback函数放入队列中,被放入队列中的异步事件不会立即回调,等到当前执行栈中的任务都执行完成,处于闲置状态的主线程按照队列顺序将处于首位事件的callback函数放入执行栈中,执行该函数的同步代码,如果遇到了异步事件,同样也会将其回调函数放入事件队列中......

  如此反复,就形成了一个无限循环,这也是被称为“事件循环(EventLoop)”的原因。

  宏任务(Micro task)和微任务(Macro task)

  js事件循环的基本原理已经描述清楚,但是异步任务之间也有所不同。

  上面讲到,js在执行异步任务时,回调函数会被放在js的任务队列中,实际上,回调函数的类别不同,执行的优先级也不同。

  不同的优先级被分为两类,一类是宏任务(Micro task),一类是微任务(Macro task)。

  回调函数是微任务时,会被放在微任务队列,回调函数是宏任务时,会被放在宏任务队列。微任务的优先级高于宏任务,当主线程的任务执行完成时,会首先去执行微任务队列中首位的回调函数,当微任务队列中为空时,才回去执行宏任务队列中的回调函数。

  常见的微任务有:promise,常见的宏任务有setInterval等。

  因此,事件循环的执行流程图如下所示:

1-2.png



作者:张欢    

来源:http://www.51testing.com/html/26/n-7792026.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 软件测试职业发展方向,大体上可以分为管理路线、技术路线、管理+技术路线。软件测试,是技术主导的职业;不管选择哪条发展路线,都是需要一定的技术沉淀,只是相对来说,管理路线对技术方面要求不高而已。那么我们就先挑重头的技术路线展开讨论。一般来说,一个普通的测试工程师刚入行,3个月左右熟悉企业的工作流程和模式,那么今后的工作内容趋于平稳。然而社会是残酷的!如果单单停留在测试工程师的阶段,若干年后,相信你再也竞争不过那个时候的应届毕业生,当你的工作技能和职业素质趋于与那些朝气蓬勃的年轻人相当时,企业会毫不留情的选择他们,而release你,因为你的成本消耗要比他们高,这是大实话!然而现实又是公平的!因为...
            15 15 1285
            分享
          • 今天是21天更文计划的最后一天了,这也是沐沐写的第21篇文章,算是对过去几年工作的一个总结。写文章的过程中也深刻的意识到自己掌握的知识很浅薄,有广度没有深度,后期仍需继续深入学习。今天我看着自己桌面上一大堆的工具,突然就想和大家分享一下工作中常用的一些工具,也能反映出我们测试人员需要掌握哪些技能,也许今天分享的工具不是最好用的,但是对应的技能应该是我们测试人员都建议去掌握的。一、自动化工具目前自动化工具、开源框架都比较多,沐沐也尝试过很多框架,最终让我青睐的还是下图中标红的框架。UI自动化框架Cypress、接口和性能工具JMeter、以及最近爆火的接口工具ApiPost。二、性能工具性能测试...
            1 0 2925
            分享
          • 一、新建目录文件夹二、新建请求(api接口)三、添加请求方法、url、及参数1、选择请求方法为post2、选择传递的参数格式,并填写参数四种常见的POST提交数据方式详解:1、form-data:就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的...
            0 0 1972
            分享
          •   我是一个刚进入社会的测试新人,在刚踏入社会时,根本不知道自己能够干嘛,自己想干嘛,我很羡慕那些知道自己喜欢什么,自己想干什么的人,有一件自己喜欢的东西真得很好。  我找工作的时候心情非常焦虑,因为没有什么面试机会,每天去招聘网站上跟人交流寻找面试机会,好不容易有几个面试机会,但也因为准备不充分等原因,没有通过面试,没有得到工作机会。  我很苦恼,我在想自己是否适合这个行业,是否适合这个工作岗位。家人呢也很关心自己的工作情况,每天会打电话询问,其实情况是很糟糕的,但不想让家人担心,只能说自己过得还挺好,面试机会也挺多,让他们不要跟着自己忧心。  因为刚出来没有什么收入,每天的开销也挺大,一直...
            14 14 1872
            分享
          • 1.monkey的简单介绍Monkey测试是Android app自动化测试的一种手段,Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入等,看设备是否出异常。当Monkey程序在模拟器或设备运行的时候,如果用户出发了比如点击,触摸,手势或一些系统级别的事件的时候,它就会产生随机事件,所以可以用Monkey用随机重复的方法去测试app。一般情况下单个app monkey 模拟测试10万次足矣。2.以下是app monkey测试的详细步骤先进入cmd界面,输入adb devices,查看是否正常连接;输入adb logcat | findstr START 监控app,打开你要测试...
            13 13 1368
            分享
      • 51testing软件测试圈微信