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 相关文章推荐
Javascript实现的鼠标经过时播放声音
May 18 Javascript
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
简单的代码实现jquery定时器
Nov 17 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
Feb 10 Javascript
javascript 的变量、作用域和内存问题
Apr 19 Javascript
vue自定义指令用法经典实例小结
Mar 16 Javascript
使用jQuery如何写一个含验证码的登录界面
May 13 jQuery
详解nvm管理多版本node踩坑
Jul 26 Javascript
js实现开关灯效果
Mar 30 Javascript
JS Canvas接口和动画效果大全
Apr 29 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开发文件系统实例讲解
2006/10/09 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
用户注册常用javascript代码
2009/08/29 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
再谈javascript原型继承
2014/11/10 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
高中生学习的自我评价
2013/12/14 职场文书
美容院考勤制度
2014/01/30 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
个人委托书范文
2015/01/28 职场文书
企业团队精神心得体会
2016/01/19 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
详解GaussDB for MySQL性能优化
2021/05/18 MySQL