美文网首页
JS 执行机制杂记

JS 执行机制杂记

作者: Kerwin_F | 来源:发表于2018-11-10 21:54 被阅读15次

    JS 是一门单线程语言、解释型语言(Python同为解释型,相对于编译型存在),虽然最新的HTML5 提出了 web-Worker,但是 javascript 是以单线程为核心,所以一切多线程

    JS 运行机制

    以下笔记摘录自阮一峰老师笔记,JavaSvcript 运行机制详解:再谈Event Loop

    任务队列

    因为 JS 为单线程,所以所有任务都需要进行排队,自然如果前一个任务用时过长(像IO操作),就会导致整个队列阻塞,所以就需要将一些任务进行挂起。

    于是将所有任务分为两种,一种为同步任务(synchronous),另一种是异步任务

    (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
    (2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
    (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行
    (4)主线程不断重复上面的第三步。

    上面只是简单的说到同步任务与异步任务的执行顺序,接下来说明如何进行异步任务

    image.png

    首先异步任务必须指定回调函数(callback),这段代码就是会被主线程挂起的代码。异步任务进入 event table,当指定事情完成后,就将异步任务加入 Event Queue,等待主线程上的任务完成后,就执行Queue 里的异步任务,也就是执行对应的回调函数

    异步任务有更精细的定义:

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

    给个例子

    console.log("start");
    setTimeout(function() {
        console.log('setTimeout');
    })
    
    new Promise(function(resolve) {
        console.log('create promise');
    }).then(function() {
        console.log('promise then');
    })
    
    console.log('end');
    
    

    打印的顺序为:

    start
    create promise
    end
    promise then
    

    以上部分内容摘录引用自
    这一次,彻底弄懂 JavaScript 执行机制

    相关文章

      网友评论

          本文标题:JS 执行机制杂记

          本文链接:https://www.haomeiwen.com/subject/qzavtqtx.html