JavaScript事件循环同步任务与异步任务

本篇文章给大家带来了关于javascript的相关知识,主要介绍了javascript事件循环同步任务与异步任务,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下。

JavaScript事件循环同步任务与异步任务

【相关推荐:javascript视频教程、web前端】

前言

首先,在学习js中同步异步的问题前,需要明白,js是单线程的,为什么它得是单线程的呢?这得从它的使用场景来看了,它主要是用来让用户与页面进行交互的吧。那么假设js是多线程的,在这个线程里面,用户点击某个按钮会增加一个DOM节点,在另一个线程里面,用户点击这个按钮又会删除一个DOM节点,那么此时js就不知道该听谁的了。那同步异步的出现又是为了什么呢?假设没有异步,那么我们在向服务器请求数据时,可能会因为网络不好,卡了半天,这时候因为是同步的,所以网页必须等待数据请求回来才能继续和用户交互,这样会导致整个网页很奇怪的卡住了,用户体验很不好。

执行栈与任务队列

执行栈

姑且先不说执行栈是什么,先说栈是什么吧。栈就好似一个桶,最先放入的东西肯定是最后拿出来的,就是大家常说的先进后出。

立即学习“Java免费学习笔记(深入)”;

05.png

 那么执行栈就是把图中的内容块变成代码任务,光说肯定说不明白,还是得上代码:

function fn (count) {            if (count 

这是一段很简单的递归代码,这里我们直接上图解释(这里其实画的不严谨,栈底应该是全局执行上下文):

04.png

js中所有的任务都会在主线程上执行然后形成一个执行栈(请记住这一点!!!)

任务队列

那么队列和栈则是相反的,队列是先进先出的。其实很好理解,和我们平时排队是一个道理,先进入队伍的人肯定先出来。那么任务队列通俗理解就是用来放置异步任务的回调函数的(也请记住这一点!!!)

同步任务与异步任务

先上一点概念性的东西,打个基础:

同步任务

很多人在理解同步任务的时候会被它的语义搞混,其实同步任务不是同步一起执行的。它是要等待上一个执行任务结束才可以执行下一个任务,这里说起来也并不晦涩难懂,但是还是写段简单的代码解释一下:

console.log(1)console.log(2)console.log(3)

登录后复制

代码很简单吧,很明显输出结果是1,2,3,这就是同步代码,那么我们就可以总结了,同步任务就是在主线程上面排队,然后一个一个进入执行栈执行,直到执行栈为空。

异步任务

还是直接举个栗子:

console.log(1)setTimeout(() => {    console.log(2)}, 1000)console.log(3)

登录后复制

这段代码的输出和上面同步代码的输出不一样,它的输出顺序是1,3,2,这就是异步代码,它并不会按照执行顺序去执行,

同样我们用官方话语总结一下:异步任务指的是,不进入主线程、而进入"任务队列"(Event queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行 如果不理解没有关系,后面说到了事件循环就会醍醐灌顶了。

js的执行机制

先上比较晦涩难懂的概念:

1. 同步任务由JavaScript 主线程按顺序执行。2. 异步任务委托给宿主环境执行。3. 异步任务完成后,对应的回调函数会被加入到任务队列中等待执行,任务队列又被分为宏任务队列和微任务队列,优先执行微任务队列,常见的微任务有new Promise().then,常见的宏任务有定时器4. JavaScript 主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行。5. JavaScript 主线程不断重复上面的第4 步,在执行回调函数时又会按照上面的四步去执行。

js一直从任务队列中取回调函数,然后放入主线程中执行,这是一个循环不断的过程,所以把它叫做事件循环。

这个还是要简单粗暴的来段代码会更直观一点:

const promise = new Promise((resolve, reject) => {      console.log(1);      setTimeout(() => {          console.log("timerStart");          resolve("success");          console.log("timerEnd");       }, 0);      console.log(2);  });  promise.then((res) => {      console.log(res);  });  console.log(4);

登录后复制

现在我们根据上面的规则一步一步分析这段代码,如果不懂Promise也没有关系,我保证这并不影响你对事件循环的理解。现在你就把自己当成js代码的检察官,要正确把它们放在合适的“位置”

检察官的第一步就是判断哪些是同步代码,哪些是异步代码,OK,首先从上往下看,Promise本身是同步的,所以它应该在主线程上排队,然后继续看pomise.then是个异步任务,并且是属于微任务的,它的回调函数应该在微任务队列中(此时还不在),最后一句输出语句是同步代码,应该在主线程上排队。第二步,执行主线程上的同步代码,首先有Promise排着队呢,所以先输出1,随后有个定时器,所以应该把它挂起执行,由于它没有时间延迟,所以回调函数直接被放入宏任务队列,继续执行代码,遇到打印,直接输出2。现在主线程还有其他的同步代码不?是不是还有一个输出语句,所以输出4,现在主线程上的同步代码执行完了第三步读取任务队列,由于微任务队列上没有东西(Promise的状态并没有改变,不会执行promise.then()),所以读取宏任务队列上的回调函数,回调函数进入主线程执行,首先输出timerStart,然后promise状态发生改变,然后又遇到一个输出语句,输出timerEnd。现在主线程上又没有东西了,又得去看任务队列上有没有东西了。第四步,由于promise状态发生改变了,所以微任务队列上有回调函数了,执行输出语句,res为success,输出success

【相关推荐:javascript视频教程、web前端】

以上就是JavaScript事件循环同步任务与异步任务的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2698607.html

(0)
上一篇 2025年3月7日 18:51:11
下一篇 2025年3月7日 08:02:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JavaScript webpack5配置及使用基本介绍

    本篇文章给大家带来了关于javascript的相关知识,webpack 是一个现代 javascript 应用程序的静态模块打包器(module bundler),下面一起来看一下javascript webpack5配置及使用基本介绍,希…

    2025年3月7日 编程技术
    200
  • 归纳总结JavaScript条件判断使用技巧

    本篇文章给大家带来了关于javascript的相关知识,其中主要为大家介绍了javascript 条件判断使用技巧详解,有需要的朋友可以借鉴参考下,下面一起来看一下,希望对大家有帮助。 【相关推荐:javascript视频教程、web前端】…

    2025年3月7日
    200
  • 关于JavaScript中的数组方法和循环

    本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于javascript中的数组方法和循环,具有很好的参考价值,希望对大家有所帮助。 【相关推荐:javascript视频教程、web前端】 1、基本概念 JavaScr…

    2025年3月7日 编程技术
    200
  • 全面解析JavaScript中null

    本篇文章给大家带来了关于javascript的相关知识,null是一种原始类型,表示有意不包含任何对象值,下面就来看一下 javascript 中的 null 的一切: 它的含义,如何检测它,null 和 undefined 之间的区别,以…

    2025年3月7日
    200
  • 简单了解JavaScript变量or循环中的var和let

    本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了javascript变量or循环中的var和let详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,下面一起来看一下,希望对大家有帮助。 【相关推荐:javasc…

    2025年3月7日
    200
  • 分享12道面试题,看你懂不懂JavaScript!

    你到底懂不懂javascript?下面本篇文章给大家整理分享12道javascript面试题,来做做这12道面试题试试,看看能不能全部答对! JavaScript 是每一个前端开发者都应该掌握的基础技术,但是很多时候,你可能并不完全懂 Ja…

    2025年3月7日
    200
  • JavaScript如何改变this指向?三种方法浅析

    javascript如何改变this指向?下面本篇文章给大家介绍一下js改变this指向的三种方法,希望对大家有所帮助! 一、this指向 点击打开视频讲解更加详细 this随处可见,一般谁调用,this就指向谁。this在不同环境下,不同…

    2025年3月7日
    200
  • 一文带你熟练使用最常用的ES6

    本篇文章带大家聊聊es6,带你30分钟熟练使用最常用的es6,还不学是等着被卷死? 一. 关于ES6 了解一门技术或者语言,最好的方法就是知道它能做些什么  ES6 , 它是由 ECMA 国际标准化组织,制定的一项脚本语言的标准化规范 那么…

    2025年3月7日
    200
  • javascript怎么求素数

    求素数的方法:1、遍历1~n区间中的所有自然数给n来除,若余数为0则表示该数n不是素数,否则就是素数,语法“for(i=2;i 本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。 素数的概念 素数又…

    2025年3月7日 编程技术
    200
  • JavaScript五个常用功能示例(总结分享)

    本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了五个常用功能及其示例,包括了计时器、流程控制、闭包应用、arguments剩余参数以及二次封装函数的相关问题,下面一起来看一下,希望对大家有帮助。 【相关推荐:javas…

    2025年3月7日
    200

发表回复

登录后才能评论