什么是事件循环?

有一道经典面试题:浏览器输入一个地址回车后都发生了什么?
这道题从前端角度上讲,主要考察了浏览器的一些进程和线程的知识,下面一一剖析之。
以google浏览器为例。

brower进程

当你打开一个tab窗口,其实就是建立了一个brower进程,这个可以打开任务管理器看到。然后你可以在地址栏输入一个url,回车,等待页面。

render渲染进程

其实我们打交道最多的就是这个内核渲染进程了。这个进程拥有好多线程给他干活。其中最重要的有三大线程:

1、GUI渲染线程。

负责绘制dom。

2、JS引擎线程。

负责解析js代码。

3、异步线程。

说异步线程并不准确,其实它是几个线程的综合体,分别是:
1)事件触发线程(click、onload等)
2)定时触发器线程(timeout)
3)异步http请求线程(ajax)
线程有个锁的概念,啥意思呢?
最形象的比喻就是上厕所。一哥们先进去,把门锁好,无论他在里面蹲多久,另一个哥们就是再急,他也不能破门而入,只有等里面的人舒服完了,他才能进去。
GUI渲染线程和JS引擎线程就是这种互斥关系,GUI线程执行时把门锁好,JS引擎只能等待,只有等人家完事了才能轮到它执行,反过来亦是如此。
为什么这么设计呢?
这是因为js可以控制dom,如果dom在渲染时不禁止js的执行,那就会出现状态不一致的现象。
我们可以把js引擎线程看作是同步线程。它只负责执行同步的代码,当遇到异步的代码,就会踢到异步线程里面执行。
用一张图加深一下印象哈:

浏览器线程.jpg

那么,异步线程又是怎么跟JS引擎线程通信呢?这就引出了Event Loop事件循环机制。
我们知道,js是单线程的,这个单线程就是指JS引擎线程。
那js代码是如何执行的呢?大概可以分这么几步。
第一步:JS引擎线程执行同步代码,遇到异步代码后踢到异步线程,异步线程拿到代码后独立执行(这里以timeout为例)
第二步:dom渲染。
JS引擎线程维护了一个执行栈,当执行栈为空时,说明同步代码已经执行完毕,此时会将执行权交给GUI线程,GUI线程拿到执行权后,会进行dom渲染操作(dom渲染单独列一章讲解)
第三步:任务队列。
当GUI线程和JS引擎线程交互时,异步线程独立执行timeout,执行完毕后,它会将回调函数推入一个队列,这个队列我们称为任务队列。
任务队列里面全是待执行的回调函数,那什么时候执行呢?
第四步:JS引擎执行任务。
GUI线程执行完后将执行权交给JS引擎线程,此时执行栈是空的,然后JS引擎就会调取任务队列里面的回调函数来入栈执行。
这个任务分为两种,一种叫微任务,一种叫宏任务。
微任务有:nextTick、Promise.then、MutationObserver等;
宏任务有:setTimeout、setInterval、setImmediate、MessageChannel、postMessage等。
他们的执行顺序是:
先执行微任务,再执行宏任务。
第五步:一次EventLoop完毕。
当执行完任务队列后(队列为空),JS引擎线程的执行栈为空,此时将执行权交给GUI线程进行dom渲染,这称为一轮事件循环。
事实上,JS引擎线程是while(true)永久循环,会不断的检测任务队列,如果发现了再有新的任务消息,就会引发第二轮事件循环,如此类推。
最后放一张图加深印象:
eventloop.png

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

推荐阅读更多精彩内容