深入了解JS事件循环机制

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

写在前面

js里的事件循环机制十分有趣。从很多面试题也可以看出来,考察简单的settimeout也就是考察这个机制的。
在之前,我只是简单地认为由于函数执行很快,settimeout执行时间即便为0也不会马上输出,而是等待函数执行完后再输出。这只对了一半。
实际上其运行机制就是js中的事件循环机制,在这个循环机制中呢,又与call stack和task queue有关。

js事件循环机制

事件循环机制呢,简单点来说,就是在执行上下文的过程中,对函数的入栈和出栈。执行前函数先入栈,执行完后函数出栈。如若遇到了一些异步操作像回调函数以及ajax、setTimeout等,会先将他们交给浏览器的其他模块去执行,执行完后,会把回调函数放入到taskqueue中。当所有的call stack执行完后再开始执行task queue中的函数。
举一个简单的例子:

console.log(1);setTimeout(function(){console.log(2);}, 0);console.log(3);

登录后复制

我们来看一下执行的内部过程
1. 执行第一句,放入call stack中,输出 1
这里写图片描述
2. 第一句出栈,执行第二句,由于是异步执行,交给其他模块。
这里写图片描述
3. 执行完后,将回调函数放入taskqueue中
这里写图片描述
4. 执行下一句,同第一步一样,将语句入栈并执行,输出3
这里写图片描述
5. 语句出栈,此时call stack空了。开始执行task queue任务,输出2
这里写图片描述
所以,输出结果是
这里写图片描述
与预想一致。

进阶

如果添加了Promise又如何工作呢?
我们知道,Promise的回调函数不是传入的,而是使用then来调用的。因此,Promise中定义的函数应该是马上执行的,then才是其回调函数,放入queue队列中。
在参考的文章中还提到了一个重要的概念:

macro-task包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。 micro-task包括:process.nextTick, Promises, Object.observe, MutationObserver  执行顺序:函数调用栈清空只剩全局执行上下文,然后开始执行所有的micro-task。当所有可执行的micro-task执行完毕之后。循环再次执行macro-task中的一个任务队列,执行完之后再执行所有的micro-task,就这样一直循环。

再看一个例子:

(function test() {    setTimeout(function() {console.log(4)}, 0);    new Promise(function executor(resolve) {        console.log(1);        for( var i=0 ; i

具体的过程可以看上面那篇文章。大概过程如下:
1. 遇到setTimeout,交给其他模块执行,执行完后回调放入macro-task中
2. 遇到Promise,立即执行里面的function,输出1。
3. 循环开始,遇到resolve(),修改Promise状态为fulfill。继续执行,输出2。
4. 遇到then,将回调放入micro-task中。
5. 继续执行,输出3。
6. call stack执行完毕了。开始执行micro-task中的回调函数,输出5。
7. micro-task执行完毕,开始执行macro-task中的回调函数,输出4。
8. 结束。

登录后复制

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

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

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

(0)
上一篇 2025年3月8日 14:05:40
下一篇 2025年2月25日 12:56:19

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

相关推荐

  • 详解JavaScript运行机制以及概念分析

    对JavaScript有个很模糊的印象,它是单线程异步的。本文主要来说说JavaScript到底是怎么运行的。但在这之前,让我们先理一下这些概念(现学现卖)。 基本概念 线程与进程 进程(process)是系统资源分配和调度的单元。一个运行…

    编程技术 2025年3月8日
    200
  • js之事件循环机制概念详解

    本篇文章给大家分享的内容是js之事件循环机制概念详解,有着一定的参考价值,有需要的朋友可以参考一下 前言 在看callbacks、deferred的过程中常常遇到异步编程的概念,而异步编程又和事件循环机制息息相关,之前对事件循环和异步编程也…

    2025年3月8日
    200
  • 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

发表回复

登录后才能评论