一、单线程

为了解决这个问题,防止下一个任务等待上一个任务等待太长的时间,所以提出了 Web Worker标准,允许 JS 创建多个线程,于是JS出现了同步异步 ,异步就是可以同时进行多个任务,这样,大大的提高了我们代码的执行效率

栗子:

打印结果为:

(一) 同步任务

  • 同步任务都在主线程上执行,形成一个执行栈

(二)异步任务

  • JS的异步通过回调函数来实现,一般而言,异步任务有三种类型
  1. 普通事件: click事件 ,resize事件等
  2. 资源加载,如load,error等
  3. 定时器,包括 setInterval 和setTimeout等
  • 同步任务是放到啊主线程的执行栈中,异步任务相关回调函数是放到任务队列(消息队列)中

二、JS执行机制

三、事件循环 (event loop)

遇到多个任务的时候,JS是如何去进行处理的呢

所有的异步任务都要放到任务队列中去吗?或者谁放在前面,谁放在后面呢?这时候就引入JS的异步进程进行处理

  1. 先执行console.log(1) 打印 1

  2. 然后将 document.onclick 提交给异步进程处理,决定是否写入任务队列中,只有点击了才会把回调函数的异步任务就放到任务队列中去,如果不点击就不写入到任务队列中去

  3. 再执行console.log(2) 打印2

  4. 将setTimeout提交给异步进程进行处理,只要3秒时间到了,才会把异步回调写到任务队列中去,只是写入,尚未执行,要等到所有的同步任务都结束了才去执行

  5. 在没有执行点击事件的时候,结果为1,2,3

  6. 如果在3秒之前就点击的话,那么就会先执行点击事件的回调函数

  7. 假设在3秒之前没有进行,那么当定时器的任务执行完之后,就把任务队列中清空,但是同步任务会反复查看任务队列中是否还有任务,如果此时执行点击事件的话,又会把点击事件的回调函数放入到任务队列中去执行,当执行完后又会清空,此时如果再次点击的话,又会把点击的回调放到队列中去执行

上图理解:



总结:

由于主线程不断的重复获取任务,执行任务,再获取任务,再执行任务,所有这种机制就被称为 事件循环 (event loop)

简述 JavaScript 的执行机制的更多相关文章

  1. javaScript的执行机制-同步任务-异步任务-微任务-宏任务

    一.概念理解 1.关于javascript javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是单线程这一核心仍未改变.所以一切javascr ...

  2. 简述JavaScript的运行机制

    想要理解JavaScript的运行机制,需要分别深刻理解以下几个点: · JavaScript的单线程机制 · 任务队列(同步任务和异步任务) · 事件和回调函数 · 定时器 · Event Loop ...

  3. javascript的执行机制—Event Loop

    既然今天要谈的是javascript的事件循环机制,要理解事件循环,首先要知道事件循环是什么. 我们先从一个例子来看一下javascript的执行顺序. <script> setTimeo ...

  4. JavaScript的执行机制

    JavaScript是单线程的,任务的执行时自上而下的,这就有了一个问题,当遇到一个比较耗时的任务时,下面的代码就会被阻塞,这就意味着卡死.所以js是有异步的,它的实现主要是通过事件循环(event ...

  5. 一段代码说明javascript闭包执行机制

    假设你能理解以下代码的执行结果,应该就算理解闭包的执行机制了. var name = "tom"; var myobj = { name: "jackson", ...

  6. JavaScript 的执行机制

    一.关于javascript javascript是一门单线程语言,在最新的HTML5中提出了Web Worker,但javascript是单线程这一核心仍未改变. 为什么js是单线程的语言?因为最初 ...

  7. javascript执行机制

    文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的 ...

  8. 彻底弄懂 JavaScript 执行机制

    本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定 ...

  9. JavaScript 执行机制

    一.宏任务与微任务 macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTi ...

  10. 转载---JavaScript执行机制

    很好的一篇文章,原地址 JavaScript执行机制 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不 ...

随机推荐

  1. 谷歌浏览器xpath获取网页按钮路径

    谷歌浏览器打开要获取的页面按下F12打开开发者工具 点击最左边的元素选择器,高亮后光标移动到对应元素框(这里只选择里层的元素,如这里要选到input级别) 点击后下方HTML会高亮显示,鼠标移动上去右 ...

  2. SCI简介和写作顺序

    一.SCI论文组成部分简介 一篇完整的 sci 论文主要包括以下几个主要的组成部分,从前往后依次分别是 Title 就是说这个文章的标题其次是 Abstract 也就是这个文章的摘要.接下来是 Int ...

  3. vue 3.0 常用API 的介绍

    vue3.0 生命周期 写法一 和vue2.x 一致 区别在于(beforeUnmount.unmount)名称不一样 写法二 在setup 中使用, 需要引用 如: import { onBefor ...

  4. JUC-学习笔记

    传统的多线程开发方式 implements Runnable public class oldThreadDev implements Runnable { @Override public void ...

  5. layui文件上传

    //前端代码 <div class="layui-form-item"> <label class="layui-form-label"> ...

  6. typora使用CSDN图床

    前言 软件下载地址 typora 是一款好用的 markdown 文档编辑器. 我之前研究过CSDN上传图片的接口,前几天发现了Typora 这个好用的软件,可以自定义图床,因为我很多文章图片资源用的 ...

  7. 深入浅出学习透析 Nginx 服务器的基本原理和配置指南「运维操作实战篇」

    Nginx前提回顾 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: Web服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效 ...

  8. 初始化一个ArrayList的多种方式

    序言 本片文章用于归纳java中初始化一个ArrayList的几种方式 add方法添加 最基础的方式就是我们在new一个ArrayList之后使用add方法添加元素 /** * 第一种方式,通过add ...

  9. 【每日一题】【链表or双指针循环条件】2022年2月26日-NC96 判断一个链表是否为回文结构

    描述给定一个链表,请判断该链表是否为回文结构.回文是指该字符串正序逆序完全一致. 思路: public boolean isPail (ListNode head) { ListNode node = ...

  10. 如何在 .Net 7 中将 Query 绑定到数组

    在 .Net 7 中,我们可以通过绑定数组的方式来接收来自查询字符串的参数.这样就不需要再使用逗号分隔的字符串来获取参数了. 代码演示 假设我们需要从 query 上接受多个 id 并返回查询的结果. ...