JS 线程简述

js是单线程的,一次只能执行一个任务,执行完毕后才能继续下一个。

js执行任务的方式也叫作同步执行,同步和异步与我们平时理解的不太一样,平时的同步我们会认为是多个事情一起做,但是在js中我们所谓的同步任务是一个接一个的像是排队一样的去做。

同步任务是指在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务,当我们打开网站时,网站的渲染过程,比如元素的渲染,其实就是一个同步任务

但是只有同步任务是不能满足日常的一些需求的,这个时候便出现了一个异步概念。

异步任务是指不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程,当我们打开网站时,像图片的加载,音乐的加载,其实就是一个异步任务

js中的异步任务又分宏任务和微任务(大概如下所示):

宏任务:渲染事件、请求、script、setTimeout、setInterval

微任务:Promise.then、MutationObserver(监听DOM)

JS 执行机制

现在我们已经知道了js的同步和异步任务以及异步任务中的宏任务和微任务,下面就是执行顺序的问题啦。

当执行任务栈中的同步任务执行完后,就会去任务队列中拿一个宏任务放到执行栈中执行,执行完该宏任务中的所有微任务,再到任务队列中拿宏任务,即一个宏任务、所有微任务渲染、一个宏任务、所有微任务渲染...(不是所有微任务之后都会执行渲染),如此形成循环,即事件循环(EventLoop)
简单来讲就是:
同步任务01 > 异步任务 > 宏任务01 > 微任务01 > 微任务02... > 宏任务02...  

js任务执行顺序的更多相关文章

  1. 浅析js的执行顺序

    javascript是一种描述型的脚本语言,是一种解析语言,由浏览器动态解析,不同种类的浏览器不同版本的浏览器对于js的解析有着微小的差别,不同浏览器的js解析引擎效率也有高低,下面来给大家分析一下j ...

  2. js代码执行顺序问题

      前  言 LiuDaP 今天就给大家介绍一个特别基础的东西,javascript中函数的一点儿小知识(js代码的执行顺序),希望对大家有那么一点点帮助吧!!! 一.js--->单线程 严格意 ...

  3. 关于js事件执行顺序

    关于js事件执行顺序小技巧 js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 ...

  4. [js]js代码执行顺序/全局&私有变量/作用域链/闭包

    js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...

  5. 关于js事件执行顺序小技巧

    js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 <button ty ...

  6. js 异步执行顺序

    参考文章: js 异步执行顺序   1.js的执行顺序,先同步后异步 2.异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask队列 3.调用Promise 中的res ...

  7. 关于js预编译以及js文件执行顺序的几个问题。

    关于js的执行原理,除去html页面中直接添加的代码,js代码的放置可以分为两类. //情形a           <script type="text/javascript" ...

  8. ASP.NET相关事件及JS的执行顺序

    实验代码: ASPX: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="We ...

  9. JS代码执行顺序

    JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的.而且在分析执行同一段代码中,定义式的函数语句会被提取出来优先执行.函数定义执行完后,才会按顺序执行其他代码. 先看看 ...

  10. js的执行顺序

    js是顺序执行的,但是在一个<script></script>标签中,后面的函数会预加载.如: <script type="text/javascript&qu ...

随机推荐

  1. 生产中遇到的spark任务问题

    spark版本 2.2.0 日志里面的信息: WARN RowBasedKeyValueBatch: Calling spill() on RowBasedKeyValueBatch. Will no ...

  2. NXopen create chamfer tool

    1 void Create_chamfer_tool( char *toolName,double 直径,int 刀具号) 2 { 3 NXOpen::Session *theSession = NX ...

  3. 【ubuntu20】设置静态IP

    sudo gedit /etc/netplan/01-network-manager-all.yaml 修改文件为: # Let NetworkManager manage all devices o ...

  4. (未完成)JAVAWEB学习——

    一.Servlet开发 1.sun公司提供的一种动态web资源开发技术,本质上就要是一段Java小程序,可以将Servlet加入到容器中运行Servlet. *servlet容器 -- 能够运行ser ...

  5. HANA 2022 ME21N \ME31K 客制字段

    问题:客制字段维护不上去 解决方案:抬头字段 打补丁 note 3275982 - Data loss observed in custom fields when working in the tr ...

  6. MySQL 学习(四)并集查询

    联合查询,它是用 union 关键字把多条 select 语句的查询结果合并为一个结果集.纵向合并的前提是被合并的结果集的字段数量.顺序和数据类型必须完全一致.字段名不一样的情况下,会将第一个结果集的 ...

  7. 使用python启动appium(虚拟器)

    1.先安装各种库 https://www.cnblogs.com/zhanglingling00/p/14169462.html pip install Appium-Flutter-Finder p ...

  8. go语言的结构体、指针、方法详解

    资源来自:https://blog.csdn.net/DXB2021/article/details/122652779 结体体定义如下: type author struct{ field1 typ ...

  9. saml login的流程

    用户会访问首页/, 然后进入到指定的一个URL, 就是admin在site-settings里面的设置的那个地址, 发现权限不够,进入到403accesslogin, 然后调用user4032logi ...

  10. (K8s学习笔记七)Pod的升级和回滚

    1.Deployment的升级 示例:滚动升级busybox-deployment容器 apiVersion: apps/v1 kind: Deployment metadata: name: bus ...