JS的Event Loop
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的更多相关文章
- 浅析Node.js的Event Loop
目录 浅析Node.js的Event Loop 引出问题 Node.js的基本架构 Libuv Event Loop Event Loop Phases Overview Poll Phase The ...
- 定时器setTimeout()和Node.js的Event Loop
一.定时器 setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行.它在"任务队列"的尾部添加一个事件,因此要等到同步任务和 ...
- 理解 Node.js 的 Event loop
问题 考察如下代码,脑回路中运行并输出结果: console.log("1"); setTimeout(function setTimeout1() { console.log(& ...
- 【Node.js】Event Loop执行顺序详解
本文基于node 0.10.22版本 关于EventLoop是什么,请看阮老师写的什么是EventLoop 本文讲述的是EventLoop中的执行顺序(着重讲setImmediate, setTime ...
- Node.js学习 - Event Loop
Node.js本身是单线程,但通过事件和回调支持并发,所以性能非常高. Node.js的每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. 事件驱动程序 实例 var ev ...
- Js 运行机制和Event Loop
一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...
- JS event loop
一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...
- 理解js事件循环(event loop)
队列:先进先出 栈:后进先出 javascript的Event Loop 和 Node.js的Event Loop 区别: js(运行在浏览器),有主线程.异步任务队列的概念: node.js使用li ...
- 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...
随机推荐
- 关于window.onload和body onload冲突的解决办法
在学习用js在 页面中动态显示当前时间 和依次读取公告栏信息的 实验中 发现在将两个页面整合时 window.onload=function (){}和 <body onload="d ...
- Mac下使用tree命令
Mac下没有tree命令,但是可以通过brew进行安装,命令如下: brew install tree 装好后tree的用法和linux下的保持一致.参考:http://www.cnblogs.com ...
- 老司机谈APK瘦身套路-图片资源篇
APK作为Android系统安装包的文件格式,一直备受广大用户的关注,APK越是臃肿肥大,在下载安装过程中,它们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中 ...
- 解决问题的思维方式之Problem->Desgin->Solution(笔记)
Problem->Desgin->Solution: 1.对于每个需要实现的功能问题,我们都称之为Problem(问题). 2.解决问题的具体思考过程,寻求解决问题的方案,即为Desgin ...
- Lucio: We avoided Mourinho after every loss
Former Inter defender Lucio has revealed how players had to avoid former Nerazzurri coach Mourinho e ...
- 作为一个编程新手,我再也不怕Flink迷了我的眼!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由kyledong发表于云+社区专栏 使用 Flink 编写处理逻辑时,新手总是容易被林林总总的概念所混淆: 为什么 Flink 有那么 ...
- 一文带你入门图像分析,成为AI专家不是梦!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云AI中心发表于云+社区专栏 腾讯云高级研究员讲述,从成像到图像分析如何入门 文︱冀永楠 "AI来了"邀请到我 ...
- 【LeetCode题解】144_二叉树的前序遍历
目录 [LeetCode题解]144_二叉树的前序遍历 描述 方法一:递归 Java 代码 Python 代码 方法二:非递归(使用栈) Java 代码 Python 代码 [LeetCode题解]1 ...
- 基础语言知识C++
强制转换: (Cplusplus基础与提高(何桂林)21页) static_cast:有隐式转换的 格式: static_cast<目标类型> (标识符) int a = 10; int ...
- Java - 用静态工厂方法代替构造器
Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...