js单线程的本质 Event Loop解析


Posted in Javascript onOctober 29, 2019

怎么判断是浏览器还是node环境?

node中window是未定义;setImmediate是定义的,在浏览器中未定义

timer阶段:这个阶段会执行setTimeout和setInterval

check阶段:执行setImmediate

macro task [task] 宏任务 :script(页面代码)、setTimeout、setInterval、I/O事件、UI交互事件(点击事件)

micro task [job]  微任务: Promise、process.nextTick、Promise().then()

宏任务可以有多个队列

微任务只有一个队列

setTimeout任务之间,推迟执行的毫秒数越小,排在队列里面越靠前

在node里面,timers(setTimeout、setInterval)会优先于setImmediate

setTimeout(() => {
  console.log('setTimeout')
},0);  // 大于1000时,会先执行setImmediate
setImmediate(()=> { console.log('setImmediate')})
console.log('start');
setTimeout(function (){
  console.log('timeout');
},10);
new Promise((resolve) => {
  console.log('promise');
  resolve()
  setTimeout(() => {
    console.log('Promsie中的setTimeout');
  },0);
}).then(() => {
  console.log('then');
});
console.log('end');

运行机制

1. 在执行栈中执行一个宏任务。

2. 执行过程中遇到微任务,将微任务添加到微任务队列中。

3. 当前宏任务执行完毕,立即执行微任务队列中的任务。

4. 当前微任务队列中的任务执行完毕,检查渲染,GUI线程接管渲染。

5. 渲染完毕后,js线程接管,开启下一次事件循环,执行下一次宏任务(事件队列中取)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
浅析jQuery的链式调用之each函数
Dec 03 Javascript
JavaScript中“+”的陷阱深刻理解
Dec 04 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
Aug 12 Javascript
获取非最后一列td值并将title设为该值的方法
Oct 30 Javascript
XML文件转化成NSData对象的方法
Aug 12 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
Jul 12 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
Jun 13 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
Jun 29 jQuery
详解微信小程序之scroll-view的flex布局问题
Jan 16 Javascript
jquery实现直播视频弹幕效果
Feb 25 jQuery
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 Javascript
解决axios post 后端无法接收数据的问题
Oct 29 #Javascript
使用axios请求接口,几种content-type的区别详解
Oct 29 #Javascript
vue+elementui 对话框取消 表单验证重置示例
Oct 29 #Javascript
vue实现路由监听和参数监听
Oct 29 #Javascript
基于axios 的responseType类型的设置方法
Oct 29 #Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
Oct 29 #Javascript
vue + elementUI实现省市县三级联动的方法示例
Oct 29 #Javascript
You might like
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
php使用google地图应用实例
2014/12/31 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
JS 有名函数表达式全面解析
2010/03/19 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
python实现html转ubb代码(html2ubb)
2014/07/03 Python
python绘图方法实例入门
2015/05/19 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
python搜索算法原理及实例讲解
2020/11/18 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
考试没考好检讨书
2014/01/31 职场文书
活动策划邀请函
2014/02/06 职场文书
浪费资源的建议书
2014/03/12 职场文书
幼儿园安全责任书
2014/04/14 职场文书
活动总结怎么写
2014/04/28 职场文书
天堂的孩子观后感
2015/06/11 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技