• JavaScript运行机制


    进程和线程:

      进程:

        CPU资源分配的最小单位,进程包含多个线程。浏览器就是多进程的,每次打开一个浏览器窗口就是一个进程。

      线程:

        CPU调度的最小单位,同一进程下的各个线程之间共享程序的内存空间。

      进程和线程的关系:

        可以把进程看做一个仓库,线程是来往运输的货车,每个仓库都有属于自己的多辆货车为仓库服务,每个仓库可以同时有多辆车进行运输,但是每辆车同一时间只能干一件事。

    JavaScript单线程:

      JavaScript语言的最大的特点就是单线程,也就是同一时间只能做一件事。

      为什么JavaScript是单线程:

        JavaScript作为浏览器的脚本语言,主要用于和用户互动,以及操作DOM,这决定了它只能是单线程,否则会带来复杂的同步问题。如果JavaScript同时有两个线程,当一个线程在DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器该听谁的?所以,为了避免复杂性,JavaScript是单线程的,这时JavaScript的核心特征,并且将来也不会改变。为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是,但是,但是子线程完全受主线程控制,并且不能操作DOM,所以本质还是单线程的。

    任务队列:

      JavaScript单线程就意味所有的任务需要排队,前一个任务结束,才会执行后一个任务。但是如果前一个任务执行时间很长,后一个任务就得等着,所以任务分为两种:同步任务和异步任务。

      同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。

      异步任务:不进入主线程,而进入任务队列的任务,当任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

    Event Loop:异步执行的运行机制(同步执行也是如此,因为它可以被视为没有异步任务的异步执行)

      1、所有的同步任务都在主线程上执行,形成一个执行栈。

      2、主线程之外,还有一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”中放置一个事件。

      3、一旦执行栈中的所有同步任务执行完毕,系统就会读取“任务队列”中的事件,对应的异步任务结束等待状态,进入执行栈开始执行

      4、主线程上不断重复第三步。

    微任务和宏任务:

      宏任务:marco-task,每次执行栈执行的代码就是一个宏任务,它在下一个执行队列的最前端执行。主要场景:script、setTimeout、setInterval

      微任务:micro-task,当前任务执行结束后立即执行的任务,它在当前执行队列的最底端执行。主要场景:Promise、process.nextTick、async、await

      

     未完待续……

      

  • 相关阅读:
    使用NUnit做单元测试(总结版)
    http、ajax调试利器:Fiddler!!!(资料汇总)
    驳《从团购网站看中国人的创新精神》
    破解迷团:在asp.net  2.0服务器上运行.net 3.5(一)
    扩充NetCMS的功能:添加{TM:Repeater}{/TM:Repeater}标签
    TFS 2010 基础配置手动升级到高级配置 安装实践
    .net 中的 StringBuilder 和 TextWriter 区别
    最大团问题
    全排列问题
    ado.net连接池
  • 原文地址:https://www.cnblogs.com/wuqilang/p/11280726.html
Copyright © 2020-2023  润新知