介绍 : 随着计算机的快速发展,js现在应用地也越来越多广泛,找到方法突破单线程语言的限制很有必要。在setTimeout和setInterval加入Web Api后,浏览器给js提供的环境就包含了任务安排和多线程应用开发的强大特性。
    一、从设计的角度来看js执行机制
    (1)宿主将js代码交给js引擎执行。如果让我们来开发浏览器和node,我们应该怎么使用javascript引擎。当遇到js代码时,浏览器会首先将代码交给js引擎执行。
    执行js代码并非一锤子买卖宿主环境可能会遇到一些事件,然后把一段代码交给js引擎执行,此外宿主环境还提供了一些api给js引擎,如setTimeout,允许javascript在特定的时候执行。
    我们应该形成一个基础性的认识:js引擎会常驻于内存中,等待宿主将js代码和函数交给它执行

    二、js异步能力
    es3的js还没有异步能力,浏览器交给js执行的代码,只能顺次执行。
    es5,新增的promise使js具备了异步编码能力,从此js自身也可以发起任务了。
    宏观任务和微观任务:
    我们把宿主环境发起的任务叫作宏任务,js自身发起的叫作微任务。
    宏任务(宿主环境提供的api)包括了:
    script(整体代码)
    setTimeout、setInterval
    ui交互事件(dom事件处理函数执行)
    ajax请求
    微任务(js自身发起的任务)包括了:
    promise回调函数和Promise的一些静态方法
    async和await
    三、eventloop机制
    JavaScript 引擎等待宿主环境分配宏观任务。事件循环做的就是’等待-执行’,每个执行的过程都是宏观任务,所以我们可以大概理解:宏观任务队列相等于事件循环。
    js宏观任务中还会产生promise回调这样的异步代码,宏观任务又包含了一个微观任务队列,确保了这些微观任务在这一次的宏观任务中执行。
    image.png