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 相关文章推荐
IE8 兼容性问题(属性名区分大小写)
Jun 04 Javascript
用JavaScript隐藏控件的方法
Sep 21 Javascript
WEB 浏览器兼容 推荐收藏
May 14 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
Aug 13 Javascript
YUI Compressor压缩JavaScript原理及微优化
Jan 07 Javascript
js字符串截取函数substr substring slice使用对比
Nov 27 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
Sep 01 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
使用Vue开发一个实时性时间转换指令
Jan 17 Javascript
Node.js npm命令运行node.js脚本的方法
Oct 10 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
May 05 Javascript
vue打包npm run build时候界面报错的解决
Aug 13 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下网站防IP攻击代码,超级实用
2010/10/24 PHP
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
详细介绍Ruby中的正则表达式
2015/04/10 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
Python关于反射的实例代码分享
2020/02/20 Python
在keras里实现自定义上采样层
2020/06/28 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
Python如何发送与接收大型数组
2020/08/07 Python
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
学习心得体会
2014/01/01 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
2014年统计工作总结
2014/11/21 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
个人年度总结报告
2015/03/09 职场文书
团日活动总结格式
2015/05/11 职场文书