JavaScript Event Loop

浏览器端异步介绍

在前端Web开发中,异步操作其实有挺多的.
比如按钮事件,AJAX请求等.

由于JavaScript本质上是个单线程的.所以,它的异步执行都是依赖于一个叫事件循环的东西.Event Loop.

至于事件循环是神马?我个人是这么理解的.

  • JavaScript是个单线程语言.
  • 有一些代码是非常符合直觉线性的从上到下执行的.

比如:

var a = 0
let b = 1
const c = 2

  • 而另外的一些代码,不会因为时间的流逝而去执行.
    • 一些注册了点击按钮事件的方法,但我从来不点那个按钮.
    • 有成功和失败回调函数的方法,状态成功了,失败的那个回调函数就不会执行;而状态成功了,失败回调的那个函数就不会执行.
    • 但不论如何,它们和var a = 0;let b = 1;const c = 2; 不一样.它们不一定会执行.有可能这段代码写了但永远都不会去执行.

一段js代码

const a = 0
let b = 1
var c = 2

window.onload = function() {
    document.getElementById('btn').onclick = function() {
    console.log(`我是按钮点击事件`)
    }
}

$.get('http://localhost/data/users/1',function(data){
    console.log(data)
})


一些代码线性执行,一些代码等待时机.jpg

对于上述代码:

  • 在执行到前三行时,是正常的代码,线程就吭哧吭哧的去执行它们.
  • 在第四行window.onload 的时候,线程发现,这是不是一个需要即时执行的代码,于是就把这代码丢到了Event Loop
  • onload里面的 onclick 是属于用于触发的代码段,更加不是即时执行的代码.仍然是丢到Event Loop.
  • $.get(前半部分,请求发送是即时的,于是请求很自然的单线程吭哧吭哧的发出去的,但是后半部分,由于是一个callback,于是又丢到事件循环,它又不能即时执行,鬼知道请求响应什么时候回来呢?

所以,在一串非常简单的代码中,就有3个部分都被丢进了事件循环.其中两个是event(onload & onclick)触发的callback,另外一个是网络异步请求触发的callback.

所以在这里得出了,一些有能执行,有可能不执行的callback,一般就丢到 Event Loop了

那这三个可能执行可能不执行的代码,如何是执行的话.那它们何时执行呢?

当这三段代码丢到了 Event Loop 中去了之后,它们并不是死水一滩.它们在等待执行它们的时机.

  • 对于 onload 来说,当浏览器window加载完毕之后,它会在事件循环中看看,里面有没有之前注册需要在 onload 时机执行的代码?发现有,就去执行了.
  • 对于 onclick 来说,当按钮被点击的时候,也会去 Evnet Loop 去看看,有没有给我绑定一个函数去响应这个事件?发现有,于是就去执行这个函数
  • 对于 $.get来说,等它异步网络数据回来之后,会去Event Loop 里找,看有没有注册回调函数.发现有,于是就执行了.

可以简单的把 Event Loop 理解成一个存放在未来某个时机里可能会执行的代码容器.

时机到了,他们就执行,时机一直不到,那么就静静的等待时机.时机一直不来(按钮我就不点)就被判了无期徒刑,永远都没办法翻身.

总结
Event Loop 说简单点

  • 一个存放callback的容器.
  • 在容器里的callback一直在等待执行时机
    • 可能是网路请求数据回来了(ajax)
    • 可能是浏览器生命周期(onload)
    • 可能是用户事件(onclick)

一段代码 & 执行代码的时机

至于代码是怎么抓住时机的,我不清楚诶........

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

推荐阅读更多精彩内容