JavaScript是单线程的,只有一个执行栈,一次只能做一件事。

在浏览器中,却“好像”可以同时做几件事:点击,发送请求,执行多个函数,解析代码。

这是因为浏览器实现的Event Loop机制。

Web API

setTimeout,ajax,dom操作回调,等等都是浏览器(JS runtime)提供的。setTimeout or http or DOM 这些东西在V8引擎代码中都是找不到的,他们都是浏览器自身部署的

这些操作不占用js线程,只有在回调函数需要执行时,才会将函数推入js执行栈。

Event Loop

在浏览器DOM环境中,至少有一个event loop,“相同域名”的DOM环境至多有一个event loop。

一个event loop可以有多个task queue,task queue包含多个任务。

event loop会依次执行队列中的task。

优先执行macrotask queue的task,若某个task执行完成,会先执行microtask queue的task。

整个脚本文件本身是一个macrotask,在macrotask队列中。

名词解释

JS runtime

不仅包括js引擎,不同runtime还提供不同的功能。

比如,浏览器提供dom,ajax请求;node.js runtime提供file system,http服务等。

JavaScript Engine JS引擎

解释或者执行JS代码。

Call Stack 执行栈

执行栈

Call frame

调用帧

macrotask queue

这些会产生macrotask,会被push进到macrotask queue

setTimeout, setInterval, setImmediate, requestAnimationFrame, I/O, UI rendering

microtask queue

这些会产生microtask,会被push进到microtask queue

process.nextTick, Promises, Object.observe, MutationObserver

[参考资料]

强烈推荐这个视频,讲的很清楚 https://www.youtube.com/watch?v=8aGhZQkoFbQ

https://www.w3.org/TR/html5/webappapis.html#event-loops

https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop

https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

https://stackoverflow.com/a/25933985/7362450

https://www.zhihu.com/question/36972010/answer/71338002

https://github.com/ccforward/cc/issues/48

JS的Event Loop的更多相关文章

  1. 浅析Node.js的Event Loop

    目录 浅析Node.js的Event Loop 引出问题 Node.js的基本架构 Libuv Event Loop Event Loop Phases Overview Poll Phase The ...

  2. 定时器setTimeout()和Node.js的Event Loop

    一.定时器 setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行.它在"任务队列"的尾部添加一个事件,因此要等到同步任务和 ...

  3. 理解 Node.js 的 Event loop

    问题 考察如下代码,脑回路中运行并输出结果: console.log("1"); setTimeout(function setTimeout1() { console.log(& ...

  4. 【Node.js】Event Loop执行顺序详解

    本文基于node 0.10.22版本 关于EventLoop是什么,请看阮老师写的什么是EventLoop 本文讲述的是EventLoop中的执行顺序(着重讲setImmediate, setTime ...

  5. Node.js学习 - Event Loop

    Node.js本身是单线程,但通过事件和回调支持并发,所以性能非常高. Node.js的每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. 事件驱动程序 实例 var ev ...

  6. Js 运行机制和Event Loop

    一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...

  7. JS event loop

    一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...

  8. 理解js事件循环(event loop)

    队列:先进先出 栈:后进先出 javascript的Event Loop 和 Node.js的Event Loop 区别: js(运行在浏览器),有主线程.异步任务队列的概念: node.js使用li ...

  9. 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?

    https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...

随机推荐

  1. WCF系列教程之WCF操作协定

    一.简介 1.在定义服务协定时,在它的操作方法上都会加上OperationContract特性,此特性属于OperationContractAttribute 类,将OperationContract ...

  2. PHP 对字符串 进行填充

    1.str_pad — 使用另一个字符串填充字符串为指定长度 . 我觉得str_pad可以满足普通的数字,字符串的简单填充. string str_pad ( string $input , int ...

  3. Java Servlet 缺点

    1.web.xml配置比较多 2.servlet具有容器依赖性(tomcat没有启动,就没有用)

  4. C 标准库 - string.h之memcpy使用

    memcpy Copy block of memory Copies the values of num bytes from the location pointed to by source di ...

  5. Flex 生成行号

    private function formatIndexNumber(item:Object, colum:Object):String {      return indexNumLabelFun( ...

  6. CUBA Platform —— 开源的、可靠的企业级应用开发利器

    原文:CUBA Platform: An Open-Source Java Framework for Rapid Application Development 翻译:CUBA China CUBA ...

  7. java并发编程(4)性能与可伸缩性

    性能与可伸缩性 一.Amdahl定律 1.问题和资源的关系 在某些问题中,资源越多解决速度越快:而有些问题则相反: 注意:每个程序中必然有串行的部分,而合理的分析出串行和并行的部分对程序的影响极大:串 ...

  8. IntelliJ使用指南—— 导入Eclipse的Web项目

    通常一个团队中可能有人用eclipse,有人用intelliJ,那么经常会出现需要导入别人用eclipse建好的web项目.而IntelliJ提供了多种项目类型的导入方式,其中就有eclipse. 在 ...

  9. jquery 获取 tagName(JQuery如何得到tagName?)

    在javascript中要取得tagName十分简单,但在jQuery中官方文档却没有记载,在一通百度和谷歌之后,尝试了不少所谓秘技,都不能正确得到,经过自己的验证,终于找到了方法,于是记录下来以备忘 ...

  10. JS实现最小生成树之克鲁斯卡尔(Kruskal)算法

    克鲁斯卡尔算法打印最小生成树: 构造出所有边的集合 edges,从小到大,依次选出筛选边打印,遇到闭环(形成回路)时跳过. JS代码: //定义邻接矩阵 let Arr2 = [ [0, 10, 65 ...