当前位置: 首页 > news >正文

js执行机制

JavaScript 的执行机制是基于单线程的事件循环模型。这意味着 JavaScript 代码会按照顺序一行一行地执行,同时只能执行一个任务。让我们更详细地了解 JavaScript 的执行机制:

  1. 调用栈(Call Stack):
    JavaScript 使用调用栈来追踪代码的执行顺序。每当调用一个函数,该函数会被推入调用栈中,执行完成后从栈中弹出。这意味着 JavaScript 是通过函数调用(包括自身递归调用)来实现代码的执行。

  2. 事件循环(Event Loop):
    JavaScript 的事件循环负责管理异步任务的执行。当遇到异步任务(如定时器、网络请求等),它们会被放入任务队列(Task Queue)中等待执行。事件循环会不断地从任务队列中取出任务,放入调用栈中执行。

  3. 任务队列(Task Queue):
    任务队列用于存储异步任务。JavaScript 运行时环境提供了不同类型的任务队列,如宏任务队列(Macrotask Queue) 和微任务队列(Microtask Queue)。

    • 宏任务队列:包含一些异步操作,通常是由浏览器提供的 API 发起的,如定时器回调(setTimeout、setInterval)、DOM 事件回调等。

    • 微任务队列:用于存储具有高优先级的任务,如 Promise 的回调、MutationObserver 的回调等。

  4. 执行过程:
    当 JavaScript 的调用栈为空时,事件循环会从任务队列中选取一个任务,将其放入调用栈中执行。这个过程会持续进行,直到调用栈继续为空。执行过程可以总结为以下步骤:

    • 检查调用栈是否为空。
    • 如果调用栈为空,则从宏任务队列中选择一个任务并将其放入调用栈中执行。
    • 如果宏任务执行过程中产生了微任务(例如 Promise 的回调),则将这些微任务放入微任务队列中。
    • 当宏任务执行完成后,检查微任务队列是否为空。
    • 如果微任务队列非空,则依次将微任务放入调用栈中执行,直到微任务队列为空。
    • 回到第一步,继续检查调用栈是否为空,并重复上述步骤。

需要注意的是,JavaScript 中的同步代码(如普通函数调用)会直接在调用栈中执行,而异步代码(如定时器回调)会进入任务队列等待执行。这样避免了长时间的阻塞,同时支持并发执行多个异步任务。

http://www.lryc.cn/news/113708.html

相关文章:

  • 关于策略模式的注入问题
  • 通用Mapper的四个常见注解
  • 二进制安装K8S(单Master集群架构)
  • 基于java汽车销售分析与管理系统设计与实现
  • Glass指纹识别工具,多线程Web指纹识别工具-Chunsou
  • BIO,NIO,AIO总结
  • [腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统
  • (二)Node.js 基础模块
  • AUC及其拓展GAUC
  • 【CSS】CSS 选择器
  • 2023-08-07力扣今日四题-好题
  • Packet Tracer - IPv4 和 IPv6 编址故障排除
  • PHP国外在线教育系统源码 在线课程系统源码 直播课程系统源码提供在线课程,现场课程,测验
  • Abaqus 中最常用的子程序有哪些 硕迪科技
  • 容器——3.Collection 子接口之 Set
  • 将整数,结构体,结构体数组,链表写到文件
  • UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数
  • IDEA2021.3.1-优化设置IDEA2021.3.1-优化设置、快捷方式改为eclipse、快捷键等
  • 使用C#的窗体显示与隐藏动画效果方案 - 开源研究系列文章
  • 09_Vue3中的 toRef 和 toRefs
  • JAVA获取视频音频时长 文件大小 MultipartFileUtil和file转换
  • 刷题笔记 day9
  • 小白解密ChatGPT大模型训练;Meta开源生成式AI工具AudioCraft
  • 1 swagger简单案例
  • Flutter写一个android底部导航栏框架
  • 关于自动化测试用例失败重试的一些思考
  • JS逆向之顶像滑块
  • 【css】textarea-通过resize:none 禁止拖动设置大小
  • Linux内核学习小结
  • 八、ESP32控制8x8点阵屏