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 相关文章推荐
把JS与CSS写在同一个文件里的书写方法
Jun 02 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
基于jQuery实现文本框缩放以及上下移动功能
Nov 24 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
Apr 03 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
Apr 04 Javascript
Jquery的Ajax技术使用方法
Jan 21 jQuery
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 Javascript
node基于async/await对mysql进行封装
Jun 20 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
Sep 28 Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 Javascript
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
原生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
使用 MySQL Date/Time 类型
2008/03/26 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
php中使用websocket详解
2016/09/23 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
js用类封装pop弹窗组件
2017/10/08 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
杭州-DOTNET笔试题集
2013/09/25 面试题
安全负责人任命书
2014/06/06 职场文书
实习介绍信范文
2015/05/05 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
索尼ICF-36收音机评测
2022/04/30 无线电