zoukankan      html  css  js  c++  java
  • js运行机制,Event Loop

    js是单线程的,一般情况下,只有上一段代码执行完毕后,才会执行下面的代码。
      但是有时候需要向服务器请求数据,需要一段时间,为了不做到阻塞下面代码的运行,就有了同步任务和异步任务的区分。
      js代码从上之下运行,同步任务和异步任务执行的环境不同,可以分为以下步骤:
    • 同步任务会在主线程的执行栈内直接执行
    • 当碰到请求事件比较长的异步代码,或者其他的异步函数,会将这些执任务,放到异步环境下进行执行注册
    • 当异步任务注册完毕后,会将其回调函数放到任务队列中(像ajax成功获取会数据后执行的回调函数,计时器计时完毕执行的回调函数)
    • 等待执行栈中的代码执行完后,会依次执行任务队列中注册的函数
    • 在执行任务队列中的函数内,同样会有同步任务和异步任务,依次重复着5步,就是所说的Event Loop 事件循环

        

     
        在异步任务将回调函数放入任务队列时,还会有两种情况,宏任务与微任务之分,宏任务会进入宏任务的任务队列,微任务放到微任务队列,执行任务队列时,会先执行微任务队列中的任务。
        宏任务代表:ajax、setTimeout、setInterval
        微任务代表:process.nextTick()、   new promise().then()的  .then()内的回调函数
    1. 只要微任务队列中有任务,就先执行微任务队里的任务,
    2. 执行完后,依次执行宏任务队里中的任务
    3. 在执行一轮宏任务的时候,在该宏任务内可能会注册一些新的微任务,放到的微任务对列
    4. 当该轮宏任务执行完,会检测到微任务队里中的新任务,在依次执行微任务对列中的任务
    5. 当微任务队里中的执行完后,会继续执行宏任务对列中的任务,  以此循环下去

  • 相关阅读:
    Java中,由this关键字引发的问题
    Spring3.2.11与Quartz2.2.1整合时内存泄漏的问题的解决
    使用Nexus管理Maven仓库时,上传带依赖的第三方jar
    ActiveMQ5.10.2版本配置JMX
    JAVA的Hashtable在遍历时的迭代器线程问题
    关于JAVA中String类型的最大长度
    新增了某个模组后VS编译不过,报错说找不到头文件
    重写Overlap事件
    cmd端口占用查看和关闭端口
    转---详细的Android开发环境搭建教程
  • 原文地址:https://www.cnblogs.com/CZforever/p/10460511.html
Copyright © 2011-2022 走看看