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 相关文章推荐
jquery 新手学习常见问题解决方法
Apr 18 Javascript
js中的string.format函数代码
Aug 11 Javascript
jquery控制左右箭头滚动图片列表的实例
May 20 Javascript
javascript实现原生ajax的几种方法介绍
Sep 21 Javascript
jQuery 选择器详解
Jan 19 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
May 25 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
Nov 07 Javascript
js滚轮事件兼容性问题需要注意哪些
Nov 15 Javascript
无循环 JavaScript(map、reduce、filter和find)
Apr 08 Javascript
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
利用Blob进行文件上传的完整步骤
Aug 02 Javascript
javascript自定义日期比较函数用法示例
Jul 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
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
JavaScript 验证浏览器是否支持javascript的方法小结
2009/05/17 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
取选中的radio的值
2010/01/11 Javascript
aspx中利用js实现确认删除代码
2010/07/22 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
vue中是怎样监听数组变化的
2020/10/24 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[49:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 KG VS TNC
2018/03/31 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
详解python分布式进程
2018/10/08 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
python实现石头剪刀布小游戏
2021/01/20 Python
如何通过python画loss曲线的方法
2019/06/26 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
一套C++笔试题面试题
2012/06/06 面试题
2014大四本科生自我鉴定总结
2014/10/04 职场文书
记者节感言
2015/08/03 职场文书