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版)
Nov 19 Javascript
javascript xml为数据源的下拉框控件
Jul 07 Javascript
JS实现随机乱撞彩色圆球特效的方法
May 05 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
Jul 14 Javascript
jQuery实现的简单拖拽功能示例
Sep 13 Javascript
jquery Banner轮播选项卡
Dec 26 Javascript
简单的渐变轮播插件
Jan 12 Javascript
JS表单数据验证的正则表达式(常用)
Feb 18 Javascript
vue.js input框之间赋值方法
Aug 24 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
Sep 21 Javascript
javascript中可能用得到的全部的排序算法
Mar 05 Javascript
Vue的生命周期一起来看看
Feb 24 Vue.js
解决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
PHP中函数内引用全局变量的方法
2008/10/20 PHP
PHP5常用函数列表(分享)
2013/06/07 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
将php数组输出html表格的方法
2014/02/24 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
js鼠标悬浮出现遮罩层的方法
2015/01/28 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
Python实现汇率转换操作
2020/05/03 Python
python中wx模块的具体使用方法
2020/05/15 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
python 读取串口数据的示例
2020/11/09 Python
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
教师推荐信范文
2013/11/24 职场文书
房产委托公证书
2014/04/08 职场文书
媒体宣传策划方案
2014/05/25 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
python tkinter实现定时关机
2021/04/21 Python
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python
Nginx四层负载均衡的配置指南
2021/06/11 Servers
JavaScript 数组去重详解
2021/09/15 Javascript
box-shadow单边阴影的实现
2023/05/21 HTML / CSS