javascript 之 eventLoop
首先,javascript 是一门单线程,无阻塞的脚本语言。
- 何为单线程:就是在任何时候都只有一条线程在执行代码。
- 无阻塞:就是执行代码任务时一路绿灯,畅通无阻。
无阻塞的实现主要依赖于一个机制,就是事件循环机制。
在事件循环机制里面,有两个概念,分别是主线程和任务队列。
- 主线程:执行所有的同步任务和异步任务
- 任务队列:存放所有的异步任务
任务队列主要分为两类:
- 宏任务(macrotask):script代码,setTimeout,setInterval,setImmediately,I/O,UI render
- 微任务(microtask):promise.then()/.catch(),process.nexttick()
宏任务和微任务之间的关系:(盗图 ^_^)

注意:
- 在同一次事件循环中,宏任务的执行是先于微任务的。
- 在执行微任务时,不要产生全新的微任务。
- 只有在一次事件循环中执行完所有由于执行宏任务产生的微任务之后,才会开始执行下一个宏任务。
宏任务和微任务的关系比喻
- 宏任务:购物者
- 微任务:购物者的商品
- 执行栈:收银员
收银员在为购物者结账时,首先就是确定这个购物者服务选择的商品,然后对所有商品扫描计数之后,最后直到所有商品扫描完毕,完成结账;才算为这位购物者服务完毕。然后再为下一个购物者服务。
以上是自己的一些学习心得,希望各位大佬多多指教。
javascript 之 eventLoop的更多相关文章
- 详解javascript的eventloop(二):eventloop和dom渲染
记住: JS是单线程的,他和dom渲染共用一个线程 JS执行的时候,会给dom渲染留一些时机 上一篇讲到eventloop的执行机制,但是在这个机制中的call stack执行完成后(包括第一遍的ev ...
- 详解javascript的eventloop(一)
先看一段代码 console.log('Hi') setTimeOut(function cb1(){ console.log('cb1') },500) console.log('Bye') 第一步 ...
- queueMicrotask & EventLoop & macrotask & microtask
queueMicrotask https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/queueMicro ...
- Redis 缓存失效机制
Redis缓存失效的故事要从EXPIRE这个命令说起,EXPIRE允许用户为某个key指定超时时间,当超过这个时间之后key对应的值会被清除,这篇文章主要在分析Redis源码的基础上站在Redis设计 ...
- JavaScript EventLoop
转自:http://cek.io/blog/2015/12/03/event-loop/ What is JavaScript What is JavaScript anyway? Some word ...
- 深入理解javascript中的事件循环event-loop
前面的话 本文将详细介绍javascript中的事件循环event-loop 线程 javascript是单线程的语言,也就是说,同一个时间只能做一件事.而这个单线程的特性,与它的用途有关,作为浏览器 ...
- JavaScript 运行机制 & EventLoop
JavaScript 运行机制 & EventLoop 看阮老师博客和自己的理解,记录的学习笔记,js的单线程和 事件EventLoop 机制. 1. JavaScript是单线程 JavaS ...
- 对javascript EventLoop事件循环机制不一样的理解
前置知识点: 浏览器原理,浏览器内核5种线程及协作,JS引擎单线程设计推荐阅读: 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 [FE]浏览器渲染引擎「内核」 js异步编程,Promise ...
- [浏览器事件循环] javaScript事件循环 EventLoop
前言 Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理. 先熟悉基本概念 [堆Heap] 堆是一种数据结构 ...
随机推荐
- Netty 中的心跳检测机制
心跳检测一般存在于建立长连接 或者 需要保活的场景. 心跳的使用场景 长连接的应用场景非常的广泛,比如监控系统,IM系统,即时报价系统,推送服务等等.像这些场景都是比较注重实时性,如果每次发送数据都要 ...
- liunx系统二进制包安装编译mysql数据库
liunx系统二进制包安装编译mysql数据库 # 解压二进制压缩包 [root@localhost ~]# tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C ...
- python爬虫(1)requests库
在pycharm中安装requests库的一种方法 首先找到设置 搜索然后安装,蓝色代表已经安装 requests库中的get请求 与HTTP协议相对应,requests库也有七种请求方式. 获取ur ...
- 网站防止sql注入
防止sql注入代码:(1)修改php.ini magic_quotes_gpc=Off,打开开关,不常用: (2)获取到参数后,调用$username = addslashes($username); ...
- js中的this指针的用法
首先看下面代码: function funcA() { this.name = "hello"; console.log(this.name); this.show = funct ...
- MongoDB学习(四):通过Java使用MongoDB
环境配置 在Java项目中使用MongoDB,需要在项目中引入mongo.jar这个包.下载地址:下载 请尽量下载较新的版本,本文用的是2.10.1. 连接MongoDB public synchro ...
- 什么是动态规划?动态规划的意义是什么?https://www.zhihu.com/question/23995189
阮行止 上海洛谷网络科技有限公司 讲师 intro 很有意思的问题.以往见过许多教材,对动态规划(DP)的引入属于"奉天承运,皇帝诏曰"式:不给出一点引入,见面即拿出一大堆公式吓人 ...
- bzoj 4152[AMPPZ2014]The Captain
bzoj 4152[AMPPZ2014]The Captain 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. ...
- RF(scalar/list/dict变量)
一.scalar 变量 ${} 定义 scalar 变量 ${} 还用来取值 1.set variable 设置变量 ${name} Set Variable zhangsan log ${nam ...
- Element upload组件上传图片与回显图片
场景:新增商品时需要添加商品主图,新增成功之后可编辑 上传图片: <el-form-item label="专区logo:" style="height:160px ...