Event Loop指的是计算机系统的一种运行机制。JavaScript采用此机制解决单线程引发相关问题

在浏览器中的web应用会涉及到.JavaScript引擎、WebAPI、Event Loop、Task Queue (Macro Task, Micro Task).因此如果想弄清Event Queue.我们必须都以上都有所了解.

JavaScript引擎:

目前市面上解析JavaScript文件效率最高的就是Google的V8引擎.它主要由两个部分组成:

  • 内存堆: 负责内存分配发生的地方.
  • 调用堆栈: 代码执行时堆栈帧的位置.(是一种数据结构,记录了程序的基本位置.先进后出)
function multiply(x, y) {
return x * y;
}
function printSquare(x) {
var s = multiply(x, x);
console.log(s);
}
printSquare(5);

当引擎开始执行此代码时,调用堆栈将为空。之后,步骤如下

并发和事件循环

JavaScript是一门单线程语言.因此只有一个单一的调用堆栈,并且一次只能做一件事,当我们进行一些复杂的耗时操作(图形转换)时.浏览器就无法进行其他事情,无法渲染任何内容.也不能运行其它代码.

为了解决浏览器被阻塞的问题,JavaScript提供了一种解决方案异步回调函数(asynchronous callback functions).异步函数在解析过程中不会被立即执行,会被浏览器放入Task Queue

Task Queue 分为 Macrotask, Microtask

Event Loop 每执行一次 先从Macrotask队列中拉出一个.然后检查microtask队列是否为空.依次执行直至清空队列.

Macrotask主要包含:setTimeout、setInterval、setImmediate、I/O、UI交互事件

microtask主要包含:Promise、process.nextTick、MutaionObserver

process.nextTick 永远大于 promise.then.

Node中,_tickCallback在每一次执行完TaskQueue中的一个任务后被调用,而这个_tickCallback中实质上干了两件事:

  1. nextTickQueue中所有任务执行掉(长度最大1e4,Node版本v6.9.1)
  2. 第一步执行完后执行_runMicrotasks函数,执行microtask中的部分(promise.then注册的回调)

自测

console.log('1');

process.nextTick(function() {
console.log('4');
}); setTimeout(function() {
console.log('6');
process.nextTick(function() {
console.log('7');
});
}, 0); new Promise(function(resolve, reject) {
console.log('2');
resolve();
}).then(function() {
console.log('5');
}); console.log('3');

setImmediate和setTimeout的延迟设为0,或1的时候,他们的执行顺序是随机的。

setTimeout(() => {
console.log(2)
}, 2) setTimeout(() => {
console.log(1)
}, 1) setTimeout(() => {
console.log(0)
}, 0)
// 谷歌浏览器环境中的执行顺序是1 0 2。
// Node环境中的执行顺序是随机的

What is the JavaScript event loop?

How JavaScript works: an overview of the engine, the runtime, and the call stack

这一次,彻底弄懂 JavaScript 执行机制

Event Loop的规范和实现

初识JavaScript EventLoop的更多相关文章

  1. 笔记一、初识 Javascript

    一.初识 Javascript javascript是一种专为与网页交互儿设计的脚本语言.由三部分组成:ECMAScript  (ECMA-262定义) : 提供核心语言功能文档对象模型(DOM): ...

  2. Day15 HTML补充、初识JavaScript

    一.上节回顾 上节回顾: HTML 头部信息:编码.title.style.link(导入css文件) 身体: 内联 块级 --->inline-block(既有内联效果又有块级效果) a标签: ...

  3. 初识JavaScript(一)

    初识JavaScript(一) 最近由于工作的需要的原因,我从一个写后台的现在让我转到写前端,再加上我的js部分特别的差,所以我现在开始学习js部分的知识. 我的第一篇博文就这样开始写了.俗话说,千里 ...

  4. 《前端之路》之 初识 JavaScript

    01 初识 JavaScript 作为在码农圈混迹了 四五年的老码畜来说,学习一门新的语言,就仿佛是老司机开新车一样 轻车熟路. 为什么会这么快呢? 因为各种套路啊- 任何一种计算机语言的最开始都是和 ...

  5. 01初识 JavaScript

    1.初识 JavaScript  1.1 JavaScript 是什么  l JavaScript 是世界上最流行的语言之一,是一种运行在客户端的脚本语言 (Script 是脚本的意思) l 脚本语言 ...

  6. 初识JavaScript(三)

    初识JavaScript(三) 我从上一讲<初识JavaScript(二)>了解到了类型.值.变量的定义以及特点,本节我将学习到JavaScript中的算术运算.二进制浮点数和四舍五入的错 ...

  7. 初识JavaScript(二)

    初识JavaScript(二) 我从上一篇<初识JavaScript(一)>知道和认识JavaScript的词法结构,也开始慢慢接触到了JavaScript的使用方法,是必须按照JavaS ...

  8. 对javascript EventLoop事件循环机制不一样的理解

    前置知识点: 浏览器原理,浏览器内核5种线程及协作,JS引擎单线程设计推荐阅读: 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 [FE]浏览器渲染引擎「内核」 js异步编程,Promise ...

  9. JavaScript EventLoop

    转自:http://cek.io/blog/2015/12/03/event-loop/ What is JavaScript What is JavaScript anyway? Some word ...

随机推荐

  1. Cache一致性与DMA

    cache一致性与DMA 第一个问题 对于进行DMA操作的设备, 并不是所有系统都保持它们的cache一致性.在这种情况下, 准备进行DMA的设备可能从RAM得到陈旧的数据, 因为脏的cache行可能 ...

  2. 二进制部署1.23.4版本k8s集群-1-系统安装及环境准备

    1. 致谢 这篇文章参考了老男孩王导的视频,在此表示感谢和致敬! 2. 安装CentOS操作系统 系统镜像:CentOS-7-x86_64-DVD-2009.iso 安装过程略. 3. 环境准备 3. ...

  3. 微信小程序简易富文本

  4. [翻译] TensorFlow 分布式之论文篇 "Implementation of Control Flow in TensorFlow"

    [翻译] TensorFlow 分布式之论文篇 "Implementation of Control Flow in TensorFlow" 目录 [翻译] TensorFlow ...

  5. count()用法

  6. 手把手教你写一个SpringMVC框架

    一.介绍 在日常的 web 开发中,熟悉 java 的同学一定知道,Spring MVC 可以说是目前最流行的框架,之所以如此的流行,原因很简单:编程简洁.上手简单! 我记得刚开始入行的时候,最先接触 ...

  7. 前端—我的第一篇博客 梦开始的地方(面向对象版tab栏)

    这是我的第一篇博客 博客生涯才开始 但是人生已经过去了二十个年头了 才开始弄这个 也没搞得太懂 我原本的想法是想搞个源代码上来 但是看了半天好像就只能传html源代码 那我还有css js的部分呢 我 ...

  8. 在基于ABP框架的前端项目Vue&Element项目中采用电子签名的处理

    在前面随笔介绍了<在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理>的处理,有的时候,我们在流程中或者一些文件签署的时候,需要签上自己的大名,一 ...

  9. .Net Core 前台添加赋值POST提交到Api控制实现添加

    使用Form表单提交到数据库 这两个必须要写,不能写这样的格式,会提交获取不到数据 contentType: 'application/json',正确格式: contentType: 'applic ...

  10. 用Markdown写Html和.md也就图一乐,真骚操作还得用来做PPT

    前言 和这篇文章一样,我就是用Markdown写的.相信各位平时也就用Markdown写写文档,做做笔记,转成XHtml.Html等,今天教大伙一招骚操作:用Markdown写PPT. 绝大多数朋友做 ...