javascript事件循环event loop的简单模型解释与应用分析


Posted in Javascript onMarch 14, 2020

本文实例讲述了javascript事件循环event loop的简单模型解释与应用.分享给大家供大家参考,具体如下:

js是单线程的,但是event loop的出现,使得js拥有可以处理高并发的性能。那么怎么理解event loop呢?网上百度一堆文章,什么heap,stack,micro queue,macro queue,让初学者直接懵掉。这里采用很通俗的理解方式介绍下event loop.

event loop顾名思义是事件循环,既然是循环,那循环的是什么呢?

对于一个js文件,

1,执行当前执行上下文(初次是全局作用域)的所有同步任务,有异步任务的透出

2,执行任务队列里第一个异步任务,

3,执行当前异步任务执行上下文的所有同步任务,有异步任务透出

从上面的执行顺序可以清楚的看到循环执行的是什么,event loop循环中的循环任务是指:

执行某个执行上下文的所有同步任务,透出异步任务

看一个简单实例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>event-loop-test</title>
</head>
<body>
  <script>
    setTimeout(function(){
      console.log('测试定时事件循环')
      new Promise(function(resolve,reject){
        resolve('内层数据')
      }).then(function(data){
        console.log(data)
      })
      console.log('测试测试测试111')
      for(var i = 0; i<5000; i++){
        console.log('异步任务中的耗时同步任务')
      }
      setTimeout(function(){
        console.log(22222)  //这里透出的异步任务会在testPromise之后,在上面的for循环执行过后,testPromise已经透出异步任务,放到队列中
      },0)
    },0)
    for(var i = 0; i<5000; i++){
      console.log('测试event loop')
    }
    for(var i = 0; i<5000; i++){
      console.log('测试event loop2')
    }
    var testPromise = new Promise(function(resolve,reject){
      console.log('直接测试promiseneibu')
      setTimeout(function(){
        resolve('promise测试')
        console.log('promise内部的console') 
      },10)
    })
    testPromise.then(function(data){
      console.log(data)
    })
    console.log('我是直接运行的')
  </script>
</body>
</html>

javascript事件循环event loop的简单模型解释与应用分析

由上面的实例和分析可以得出:

任务队列中的异步任务透出和循环层级是没有关系的,任务队列中的异步任务是根据透出先后顺序排列的

建立一个简单模型:

javascript事件循环event loop的简单模型解释与应用分析

 

也可以理解为:

javascript事件循环event loop的简单模型解释与应用分析

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 Javascript
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 Javascript
JS实现页面打印(整体、局部)
Aug 18 Javascript
Vue使用vue-cli创建项目
Sep 01 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
Nov 01 Javascript
vue中如何使用ztree
Feb 06 Javascript
JS中this的指向以及call、apply的作用
May 06 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
May 30 Javascript
JavaScript进阶(一)变量声明提升实例分析
May 09 Javascript
JavaScript直接调用函数与call调用的区别实例分析
May 22 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
Mar 14 #Javascript
js实现的订阅发布者模式简单示例
Mar 14 #Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 #Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 #Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 #Javascript
js中forEach,for in,for of循环的用法示例小结
Mar 14 #Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 #Javascript
You might like
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
Python部署web开发程序的几种方法
2017/05/05 Python
Python实现登录接口的示例代码
2017/07/21 Python
详解supervisor使用教程
2017/11/21 Python
python实现按长宽比缩放图片
2018/06/07 Python
用Python实现数据的透视表的方法
2018/11/16 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
django中forms组件的使用与注意
2019/07/08 Python
在notepad++中实现直接运行python代码
2019/12/18 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
高中教师评语大全
2014/04/25 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
避暑山庄导游词
2015/02/04 职场文书
三八妇女节致辞
2015/07/31 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
正则表达式拆分url实例代码
2022/02/24 Java/Android