zoukankan      html  css  js  c++  java
  • 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

      

     未完待续……

      

  • 相关阅读:
    phpcms列表页内容如何替换?
    如何用phpcms将静态网页生成动态网页?
    简单介绍phpcms以及phpcms如何安装?
    注册账号的验证
    js跳转页面
    流程审核处理
    关于XML(可扩展标记语言)的基础知识与写法
    php随机获取验证码
    流程管理
    HDU 5894 hannnnah_j’s Biological Test
  • 原文地址:https://www.cnblogs.com/wuqilang/p/11280726.html
Copyright © 2011-2022 走看看