js事件轮询event Loop

一步步来

首先我们要知道什么是线程,进程

引用官方说法:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
进程大概等于一个工程,线程大概等于一条流水线,一个进程可以利用多个线程去执行任务

浏览器

浏览器主要由4个进程组成

  • browser主进程
    就是浏览器的主进程,一般只有一个,用于管理,协调,调配,前进后退一些大的功能,大概知道下就行

  • GPU渲染进程
    主要用于渲染一些3d动画,也是只有一个

  • 第三方插件进程
    处理第三方插件的

  • 浏览器渲染进程
    这个对于我们前端来说比较重要,每个tab都是拥有一个进程,每个tab直接互不干扰.
    其中浏览器渲染进程又有5个线程,分别是,事件触发线程,js解析线程,网络请求线程,定时器线程,GUI线程

记忆方式:g主插渲(君主差炫,君主总是差一只很炫的宠物的意思...)

浏览器渲染进程

下面会一个个讲到渲染进程里面的5个线程;

  • GUI线程
    简单的说就是负责渲染页面,dom树css树render树的构成,重绘,回流都是利用这个线程.

注意:GUI线程的js线程会互斥,也就是js线程跑的时候,GUI线程就不会跑,反之亦然

其实这个也很好理解,如果js修改了页面dom结构,GUI又要不断实时更新,不太合理,所以是互斥的,等js执行完才会更新页面的渲染

  • 网络请求线程
    主要处理一些http异步请求,接受到请求之后会把回调函数交给事件队列线程,然后再给js线程去执行代码

  • 定时器线程
    setTimeOut和setInterVal,这个线程专门读秒,因为js线程要执行代码,肯定没时间去读秒,所以额外有个定时器线程去处理,等到事件到了之后就会把回调函数推到事件队列线程那边

  • js解析线程
    js线程,解析js的脚本程序都是靠这个线程了,所以为什么说js是单线程的,因为只有一个线程去处理js,每个tab都拥有独立的js解析线程

  • 事件触发线程
    这里面主要就是存放一些,异步的回调事件,因为js解析线程很忙,所以只能另外开辟一个线程去管理这些事件,当达成某个条件后,就会触发回调函数,推入事件触发线程,事件触发线程会根据js解析线程是否空间去推到js解析线程上解析代码

记忆方法:G网定j事(g网定急死,用2g网肯定急死人,太慢了)

任务(task)和微任务(microtask)

也有人称之为宏任务(macrotask)和微任务(microtask),这两个是什么东西呢?

宏任务:代码块,setTimeout,setInterval等,宏任务是放到事件触发队列里面的

微任务:Promise,process.nextTick等,是放到微任务队列里面的,由js线程掌管

微任务在es6里面被规范为jobs queue

总体的流程大概是这样的:

1.js解析线程先执行完栈内的代码.

2.在执行事件触发线程里面的宏任务之前,先会看看微任务队列里面是否有微任务,有就会先一步调用所有的微任务.

3.调用完微任务再触发一个宏任务.

4.执行完一个宏任务会再去找微任务.

总的来说,就是js在执行宏任务前先会把微任务执行完清空,执行完一个宏任务去清空一次微任务
下面是网上看到的一个想关的面试题,执行顺序是?为什么?

            setTimeout(function() {
                console.log(1)
            }, 0);
            new Promise(function(a, b) {
                console.log(2);
                for(var i = 0; i < 10; i++) {
                    i == 9 && a();
                }
                console.log(3);
            }).then(function() {
                console.log(4)
            });
            console.log(5)

..........
................
.................
.................
..................
...................
.................
答案是 2 3 5 4 1 你答对了吗?为什么呢?

首先:

  1. 235我相信是没啥疑问的,就是js解析由上往下的执行顺序,

  2. 41在235后面,是因为都是异步的回调,所以会把回调的内容先挂起来

  3. 来看看setTimout里面的,因为虽然后面的参数是0(据说浏览器有限制最小是4毫秒).执行这段代码的时候,会先把setTimeout交给定时器线程去数,不管是0毫秒还是4毫秒也好,定时器线程数完之后就会把回调函数推到事件触发线程中.但是这个时候js解析线程还在解析下面的代码,要等js解析线程先把代码执行完,才会执行事件触发线程里面存着的回调!

  4. 最后再来看看promise里面的回调,输出的4,promise的异步回调有点不一样,它不放到事件触发线程里面,它会放到由js解析线程管理的微任务队列里面,所以js先解析完栈里面的代码,也就是输出了235之后,再执行事件触发线程里面的定时器给的回调之前,先会把微任务队列清空了,所以会先输出4,清空完再去执行事件触发线程里面的任务,也就是输出了1

所以这也是为什么setTimeOut和setInterVal有时会不准确,如果js解析线程还没解析完栈内的代码,就不能执行定时器的回调了,即使是定时器的时间到了,也没办法!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容