js之事件循环机制概念详解

本篇文章给大家分享的内容是js之事件循环机制概念详解,有着一定的参考价值,有需要的朋友可以参考一下

前言

在看callbacks、deferred的过程中常常遇到异步编程的概念,而异步编程又和事件循环机制息息相关,之前对事件循环和异步编程也是一知半解,所以先花点时间整理一下事件循环和异步编程相关的知识。

一、Heap、Stack、Queue

堆(Heap):对象被分配在一个堆中,一个用以表示一个内存中未被组织的区域。我们知道,函数是第一等对象,同时函数是“可调用的对象”。因此,当函数在被调用之前,JavaScript引擎会对函数进行编译(词法分析、语法分析、代码生成)的工作。当完成编译时会将函数(这里不限于函数,JavaScript所有皆为对象,除了undefined、null)放入堆中,分配内存空间,等待执行或调用。

栈 (Stack):当函数调用时,会形成一个“执行栈”。

任务队列:(Queue):一个 JavaScript 运行时包含了一个待处理的消息队列。每一个消息都与一个函数相关联。当栈拥有足够内存时,从队列中取出一个消息进行处理。这个处理过程包含了调用与这个消息相关联的函数(以及因而创建了一个初始堆栈帧)。当栈再次为空的时候,也就意味着消息处理结束。主线程中的所有同步任务执行完毕,再读取任务队列中的异步任务,这个过程是循环不断的。所以,整个的这种运行机制称为Event Loop(事件循环)。
同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,后一个任务才会执行;异步任务指的是不进入主线程、而进入任务队列的任务,只有当主线程上的所有同步任务执行完毕之后,主线程才会读取任务队列,开始执行异步任务。

二、理解浏览器中的事件循环

    demo1    function A(){         console.log("2");    }    console.log("1");    setTimeout(A,1000);    console.log("3");    //output:    //1    //3    //2

登录后复制

    demo2    function A(){         console.log("2");    }    console.log("1");    setTimeout(A,0);    console.log("3");    //output:    //1    //3    //2

登录后复制

demo1的运行过程大概是这样子的:
 – console.log(“1”) 进入执行栈,输出 1, 执行完成后出栈
 – setTimeout( A ,1000) 进入执行栈,出栈,同时 1s 后 把 A 放入到异步队列
 – console.log(“3”) 进入执行栈,输出 3, 执行完成后出栈
 – 至此同步队列(主线程队列)已经完成,开始查看异步队列里是否还有任务
 – A 进入 执行栈,输出2,出栈。

demo2的运行过程大概是这样子的:
 – console.log(“1”) 进入执行栈,输出 1, 执行完成后出栈
  – setTimeout( A ,1000) 进入执行栈,出栈,同时 立即 把 A 放入到异步队列
   – console.log(“3”) 进入执行栈,输出 3, 执行完成后出栈
   – 至此同步队列(主线程队列)已经完成,开始查看异步队列里是否还有任务
  – A 进入 执行栈,输出2,出栈。

哪些操作需要放入到异步队列,而哪些操作属于同步队列呢?可以参考下图。更为具体的分类,请看下篇 js事件循环机制(二)
事件循环机制

三、参考文章

1.深入理解 JavaScript 事件循环(一)— event loop

2.MDN并发模型与事件循环

3.What the heck is the event loop anyway?

4.JavaScript 运行机制详解:再谈Event Loop

以上就是js之事件循环机制概念详解的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月8日 14:05:24
下一篇 2025年3月1日 21:51:46

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

相关推荐

  • JavaScript如何以封装的方式实现冒泡排序

    最近小编在学习蒋坤的JavaScript视频,里面谈到了js中实现冒泡排序的方法,并且做到了很好的封装,以及灵活变动。具体的内容,请看正文。 未使用封装的代码  1.这段代码里面的核心代码理解了,便很好完成。 var arr=[1,6,3]…

    2025年3月8日
    200
  • JS中的关于call()和apply()的用法小结

    本篇文章给大家分享的内容是JS中的关于call()和apply()的用法小结,有着一定的参考价值,有需要的朋友可以参考一下 最近又遇到了jacvascript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的…

    编程技术 2025年3月8日
    200
  • 代码详解React Js 微信分享封装

    本篇文章给大家分享的内容是代码详解React Js 微信分享封装,有着一定的参考价值,有需要的朋友可以参考一下 话不多说,直接上源代码: /** * Created by wuyakun on 2017/5/23. */import Fet…

    编程技术 2025年3月8日
    200
  • 使用Angularjs和Vue.js对比

    本篇文章介绍的内容是关于使用Angularjs和Vue.js对比 ,现在分享给大家,有需要的朋友可以参考一下 使用Angularjs和Vue.js对比 之前项目都是使用Angularjs,(注明此处主要讲Angularjs 1)在初步使用V…

    编程技术 2025年3月8日
    200
  • RequireJS模块化开发

    本篇文章介绍的内容是RequireJS模块化开发,现在分享给大家,有需要的朋友可以参考一下 模块化开发有很多种方式,如amd,cmd, 使用require进行模块化,只要导入一个js就可, 使用require.js的第一步,是先去官方网站下…

    编程技术 2025年3月8日
    200
  • js 常用的工具方法

    本篇文章介绍的内容是关于js 常用的工具方法,现在分享给大家,有需要的朋友可以参考一下 1、cookie 操作 // setCookie()// @About 设置cookie 默认一个月失效function setCookie(name,…

    2025年3月8日 编程技术
    200
  • JS的数据类型

    本篇文章介绍的内容是js的数据类型,在这里分享给大家,有需要的朋友可以参考一下 基础数据类型 JavaScript数据类型有2大分类:一是“基本数据类型”,二是“特殊数据类型”。 其中,基本数据类型包括以下3种: (1)数字型(Number…

    编程技术 2025年3月8日
    200
  • 移动端适配之rem.js

    下面这篇文章在这里分享给大家的内容是关于移动端适配之rem.js,具有一定的额参考价值,有需要的朋友可以参考一下 移动端网页适配是一个麻烦事, 常见做法有媒体查询, js控制等. 媒体查询个人感觉比较冗余, 可少量使用, 偏爱于js来控制.…

    2025年3月8日
    200
  • JS的数据结构

    本文给大家分享的内容是关于js的数据结构,具有一定的参考价值,有需要的朋友可以参考一下 一、标识符 标识符,说白了,就是一个名字。在JavaScript中,变量和函数等都需要定义一个名字,这个名字就可以称为“标识符”。 JavaScript…

    编程技术 2025年3月8日
    200
  • JS中的判断类型

    本篇文章给大家分享的内容是关于JS中的判断类型,具有一定的参考价值,有需要的朋友可以参考一下 在js里判断类型一般有四种方法 一, typeof:这个方法大家都知道,有很多类型都判断不出来的,不推荐 二, constructor:每个函数都…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论