Javascript执行机制(setTimeout/Promise)

1.关于javscript

    javascript是一门单线程语言,在最近的html5中提出了web-worker,但javascript是单线程这一核心仍未改变,所以一切javascript版的“多线程”都是用单线程模拟出来的,javascript就是一门单线程语言。

2.javscript的事件循环

    既然js是单线程,那就像只有一个窗口的银行,客户需要排队一个一个办理业务,同理js任务也需要一个一个的顺序执行。如果一个任务耗时过长,那么最后一个任务也必须等着。那么问题来了,如果我们想浏览新闻,但是新闻包含的超清图片加载很慢,难道我们的网页要一只卡到图片完全现实出来?因此聪明的程序员将任务认为两类:同步任务,异步任务

当我们打开网站时,网页渲染过程就是一大堆同步任务。执行过程用文字描述的话就是

    1.同步任务和异步任务分别进入不同的执行场所,同步的进去主线程,异步的进入enent table并注册函数。

    2.当指定的事情完成时,event table会将这个函数移步到 event queue 

    3.主线程的任务执行完毕为空,会去event queue读取对应的函数,进入主线程执行

    4.上诉过程会不断重复,也就是常说的event loop(事件循环)

    实例图:

疑问是:那怎么直到主线程的执行栈为空啊?原因是:js引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去event queue那里检查是否用等待被调用的函数。

3.setTimeout  的执行方式是异步执行,用处一般为,延迟指定时间再执行移步函数。


根据前面的结论,上诉代码的打印顺序为 2,三秒后打印1 ,印证正确。

但是当遇到下面代码的时候


结果是打印1 的结果需要的时间远远超过3秒,这不符合我们想要的预期,我们想要的就是三秒后打印1 ,那么先看一下执行结果

    1.console.log(1)进入event table并注册,计时开始

    2.执行sleep函数,很慢,但是event table里的计时仍在继续

    3.3s到了 计时事件完成,console.log(1)进去event queue,但是此时主线程里的sleep还没有执行完成,console.log(1)只能继续等

    4.sleep执行完啦,console.log(1)进入主线程,从而执行

我们知道setTimeout 这个函数,是经过指定时间后,把要执行的任务加到event queue中,又因为单线程任务需要一个一个的执行,如果前面的任务需要的时间太久,此时setTimeout 的延时时间就会出现比较大的偏差。

4.setInterval

    对于执行顺序而言,setInterval会每隔指定的时间将注册的函数只如event queue,如果前面任务耗时太久,那么同样需要等待。

唯一需要注意一点的是,对于setInterval而言,我们知道不是每过指定时间就执行fn,而是每过指定时间就会有fn进入event queue。一旦setInterval的回调函数执行时间超过了延迟的时间,那么就完全看不出来有时间间隔了

5.promise

    对于promise而言,我们需要对js的执行了解的更细致一些,如下

    1.macro-task(宏任务):包括整体script代码,setInterval,setTimeout

    2.micro-task(微任务):promise ,process.nexttrick(nodejs的内容)

不同类型的任务会进入对应的event queue,比如setInterval,setTimeout会进入相同的event queue。

事件循环的顺序决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。看一下代码


分析一下上图代码,加深一下理解,(1)这段代码作为宏任务进入主线程,先遇到settimeout,那么将其回调函数分发到宏任务的event queue上,(2)接下来遇到promise,new promise立即执行,then函数分发到微任务的event queue中,(3)接下来遇到console.log()立即执行。(4)然后,整体script代码作为第一个宏任务执行结束,看看有哪些微任务,我们发现then在微任务event queue里,则执行,(5)第一轮循环事件结束,开始第二轮循环,当然是从宏任务的event queue开始,我们发现了宏任务event queue中的settimeout对应的回调函数,则立即执行。

图例如下:

6.下面一个例子练习


如果不会请看引用地址:https://juejin.im/post/59e85eebf265da430d571f89

结语:

1。javascript是一门单线程语言

2.Event Loop 是javascript的执行机制。



另一段描述

宏任务与微任务

JavaScript引擎把所有的任务分为两类,宏任务、微任务。

宏任务包括了:

1.script整体的代码

2.setTimeout、setInterval

3.I/O

4.UI渲染

5.postMessage

6.MessageChannel

7.requestAnimationFrame

8.setImmediate(nodeJs环境)

微任务包括了:

1.new promise.then()

2.MutaionObserver

3.pocess.nextTick(node.js环境下)

执行规则

我们讲了单线程的弊端,JavaScript是通过事件循环机制来解决这个弊端的,事件循环机制的执行规则。

1.所有代码作为宏任务进入主线程执行栈,开始执行。

2.执行过程中,同步代码会立即执行,宏任务进入宏任务队列,微任务进入到微任务队列。

3.当前宏任务执行完出队,读取微任务队列,有则执行,直到全部执行完毕。

4.执行浏览器ui进程渲染。

5.检查是否有webwork任务,有则执行。

6.本轮宏任务执行完成,回到第二步,继续执行,直到宏任务与微任务队列全部清空。

摘自: https://zhuanlan.zhihu.com/p/363974999

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

推荐阅读更多精彩内容

  • 原文在这里说明: 我通过这篇文章第一次知道JavaScript运行机制中的任务队列有宏任务和微任务之分。 文中的代...
    楠小忎阅读 260评论 0 0
  • 一.js是一门单线程的语言,js是按照语句出现的顺序执行的 二.Javascript事件循环 因为js是单线程,所...
    lmmy123阅读 332评论 0 0
  • 最近比较忙,硬是没抽出时间总结一点小知识。最近在网上看到一篇不错的文章,转一下!本文的目的就是要保证你彻底弄懂ja...
    殖民_FE阅读 283评论 1 2
  • 一、JavaScript单线程模型 JavaScript是单线程的,JavaScript只在一个线程上运行,但是浏...
    Brolly阅读 1,134评论 4 6
  • JavaScript单线程机制 JavaScript的一个语言特性(也是这门语言的核心)就是单线程。什么是单线程呢...
    October_yang阅读 513评论 0 1