JavaScript之事件循环案例讲解

 更新时间:2021年07月27日 10:01:59   作者:做一个优秀的小前端  
这篇文章主要介绍了JavaScript之事件循环案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

js中的事件循环

因为JavaScript是单线程的,同一事件只能执行一种方法,所以会将程序中的方法加入到执行栈中按照后进先出的顺序依次执行,当遇见异步任务时不会被阻塞,而是将任务放入事件队列中,继续执行执行栈中的同步代码,等当前执行栈中的所有任务都执行完毕则查找事件队列中的任务,并把任务的回调函数放入执行栈中,执行其中的同步代码,如此反复形成的循环被称为事件循环。

node.js

node.js特点

事件驱动

从上向下执行代码,当遇到需要回调的地方就加入到事件队列中,主线程运行完就去执行事件队列中的回调。整个过程不会阻塞新的事件,也不需要维护已经建立的事件

非阻塞io

主线程空闲时,就开始循环事件队列,处理事件队列中的事件,如果该事件不是io任务就亲自处理,如果是io任务,则交给线程池处理并指定回调函数,然后继续循环队列中的其他事件,当阻塞操作完成后会将结果和回调函数放入队列中,主线程循环到时就执行该回调函数。

node.js优缺点

优点

  1. 高并发:node.js用一个主线程处理所有的请求,然后对io操作进行异步处理,避开了创建、销毁线程以及在线程之间切换所需的开销和复杂性
  2. 适合io密集型应用

缺点:

  1. 不适合CPU密集型应用:长时间的计算会导致cpu时间片不能释放,使得后续io事件无法发起
  2. 不能充分利用多核cpu
  3. 可靠性低,一旦代码某个环节崩溃,整个系统都会崩溃

适用场景:

  1.  restful api:请求和响应只需少量的文本,不需要大量的逻辑处理。可以处理数万条连接,只需请求api组织数据并返回即可
  2. 大量Ajax请求的场景中
  3. 聊天服务:轻量级,高流量,没有复杂的计算逻辑

node.js的事件循环 

node事件循环依靠libuv引擎,v8解释js代码后调用对应的node api,这些api由libuv引擎驱动执行对应任务,并把不同的事件放入不同的队列中等待主线程执行,因此node的事件循环存在于libuv引擎中

libuv引擎:实现了事件循环、文件操作等,是node.js实现异步的核心

node.js的单线程仅仅指JavaScript运行在单线程中,内部可以通过线程池完成io操作

poll(查询阶段)---》check(检查阶段)---》close callback(关闭事件回调阶段)---》timer(定时器检测阶段)---》io回调阶段---》闲置阶段---》轮询阶段

poll阶段(轮询阶段):

v8将js代码解析后传入libuv引擎中,循环首先进入poll阶段。先查看poll队列是否有事件,有就按先进先出顺序执行回调

到此这篇关于JavaScript之事件循环案例讲解的文章就介绍到这了,更多相关JavaScript之事件循环内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js实现一个简易的计算器

    js实现一个简易的计算器

    这篇文章主要为大家详细介绍了js实现一个简易的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • uniapp地图组件(map)使用与遇到的一些问题总结

    uniapp地图组件(map)使用与遇到的一些问题总结

    uniapp是用vue.js开发所有前端应用的框架,开发人员只需要编写一套代码就可以发布到安卓、iOS、H5和小程序、快应用等平台,下面这篇文章主要给大家介绍了关于uniapp地图组件(map)使用与遇到的一些问题,需要的朋友可以参考下
    2022-07-07
  • JS跳转手机站url的若干注意事项

    JS跳转手机站url的若干注意事项

    去年年底开发了一个手机站平台,遇到了很多坎,今天小编给大家分享下使用JS跳转手机站url的若干注意事项,需要的朋友参考下吧
    2017-10-10
  • Bootstrap自定义文件上传下载样式

    Bootstrap自定义文件上传下载样式

    这篇文章主要教大家如何使用Bootstrap自定义文件上传下载样式,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • bootstrapValidator.min.js表单验证插件

    bootstrapValidator.min.js表单验证插件

    这篇文章主要为大家详细介绍了bootstrapValidator.min.js表单验证插件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • js添加千分位的实现代码(超简单)

    js添加千分位的实现代码(超简单)

    下面小编就为大家带来一篇js添加千分位的实现代码(超简单)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • 浅析JavaScript作用域链、执行上下文与闭包

    浅析JavaScript作用域链、执行上下文与闭包

    JavaScript 采用词法作用域(lexical scoping),函数执行依赖的变量作用域是由函数定义的时候决定,而不是函数执行的时候决定,通过本文给大家介绍JavaScript作用域链、执行上下文与闭包相关知识,感兴趣的朋友一起学习吧
    2016-02-02
  • js实现金山打字通小游戏

    js实现金山打字通小游戏

    这篇文章为大家详细主要介绍了js实现金山打字通小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 页面向下滚动ajax获取数据的实现方法(兼容手机)

    页面向下滚动ajax获取数据的实现方法(兼容手机)

    下面小编就为大家带来一篇页面向下滚动ajax获取数据的实现方法(兼容手机)。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JavaScript中好用的数组对象排序方法分享

    JavaScript中好用的数组对象排序方法分享

    在日常工作中,我们经常需要对数组对象进行排序,尤其是在处理数据可视化需求中。本文将介绍一些简单而又实用的方法,帮助你实现对数组对象的某几个 key 进行排序
    2023-05-05

最新评论