• js为什么是单线程的?10分钟了解js引擎的执行机制


    首先,请牢记2点:

    (1) JS是单线程语言

    (2) JS的Event Loop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的event loop

    1. JS为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢?

    技术的出现,都跟现实世界里的应用场景密切相关的。

    同样的,我们就结合现实场景,来回答这三个问题

    (1) JS为什么是单线程的?

    JS最初被设计用在浏览器中,那么想象一下,如果浏览器中的JS是多线程的。

    这样想,JS为什么被设计成单线程应该就容易理解了吧。

    (2) JS为什么需要异步?

    所以,JS中存在异步执行。

    (3) JS单线程又是如何实现异步的呢?

    既然JS是单线程的,只能在一条线程上执行,又是如何实现的异步呢?

    是通过的事件循环(event loop),理解了event loop机制,就理解了JS的执行机制

    2.JS中的event loop(1)

    例1,观察它的执行顺序

    运行结果是: 1 3 2

    也就是说,setTimeout里的函数并没有立即执行,而是延迟了一段时间,满足一定条件后,才去执行的,这类代码,我们叫异步代码。

    所以,这里我们首先知道了JS里的一种分类方式,就是将任务分为: 同步任务和异步任务

    图片描述

    按照这种分类方式:JS的执行机制是

    • 首先判断JS是同步还是异步,同步就进入主进程,异步就进入event table
    • 异步任务在event table中注册函数,当满足触发条件后,被推入event queue
    • 同步任务进入主线程后一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有就推入主进程中

    以上三步循环执行,这就是event loop

    所以上面的例子,你是否可以描述它的执行顺序了呢?

    3.JS中的event loop(2)

    所以,上面关于event loop就是我对JS执行机制的理解,直到我遇到了下面这段代码

    例2:

    尝试按照,上文我们刚学到的JS执行机制去分析

    所以,结果是 【马上执行for循环啦 — 代码执行结束 — 定时器开始啦 — 执行then函数啦】吗?

    亲自执行后,结果居然不是这样,而是【马上执行for循环啦 — 代码执行结束 — 执行then函数啦 — 定时器开始啦】

    那么,难道是异步任务的执行顺序,不是前后顺序,而是另有规定? 事实上,按照异步和同步的划分方式,并不准确。

    而准确的划分方式是:

    • macro-task(宏任务):包括整体代码script,setTimeout,setInterval
    • micro-task(微任务):Promise,process.nextTick

    386112937-5a5763d9ef823_articlex

    按照这种分类方式:JS的执行机制是

    • 执行一个宏任务,过程中如果遇到微任务,就将其放到微任务的【事件队列】里
    • 当前宏任务执行完成后,会查看微任务的【事件队列】,并将里面全部的微任务依次执行完

    重复以上2步骤,结合event loop(1) event loop(2) ,就是更为准确的JS执行机制了。

    尝试按照刚学的执行机制,去分析例2:

    所以最后的执行顺序是【马上执行for循环啦 — 代码执行结束 — 执行then函数啦 — 定时器开始啦】

    4. 谈谈setTimeout

    这段setTimeout代码什么意思? 我们一般说: 3秒后,会执行setTimeout里的那个函数

    但是这种说并不严谨,准确的解释是: 3秒后,setTimeout里的函数被会推入event queue,而event queue(事件队列)里的任务,只有在主线程空闲时才会执行。

    所以只有满足 (1)3秒后 (2)主线程空闲,同时满足时,才会3秒后执行该函数

    如果主线程执行内容很多,执行时间超过3秒,比如执行了10秒,那么这个函数只能10秒后执行了

  • 相关阅读:
    【今日CV 视觉论文速览】 19 Nov 2018
    【numpy求和】numpy.sum()求和
    【今日CV 视觉论文速览】16 Nov 2018
    【今日CV 视觉论文速览】15 Nov 2018
    poj 2454 Jersey Politics 随机化
    poj 3318 Matrix Multiplication 随机化算法
    hdu 3400 Line belt 三分法
    poj 3301 Texas Trip 三分法
    poj 2976 Dropping tests 0/1分数规划
    poj 3440 Coin Toss 概率问题
  • 原文地址:https://www.cnblogs.com/yzhihao/p/9377446.html
Copyright © 2020-2023  润新知