JavaScript的运行机制

news2024/11/19 2:20:38

阐述几个概念

1. ECStack ( Execution Context Stack)执行环境栈

浏览器会在计算机内存中分配一块内存,专门用来供代码执行的

2. Heap堆内存

存放东西(存放对象和方法即引用类型)

3. EC ( Execution Context ) 执行上下文

代码自己执行所在的环境
(1)全局的执行上下文EC(G)
(2)函数中的代码都会在一个单独的私有的执行 上下文中处理
(3)块级的执行上下文

4. GO ( Global Object )全局对象

浏览器端会让window指向GO,浏览器把内置的一些属性方法放到一个单独的内存中堆内存( Heap )

5. VO ( Varibale Object )变量对象

在当前的上下文中,用来存放创建的变量和值的地方(每一个执行 上下文中都会有一个自己的变量对象,函数私有上下文中叫做AO ( Activation Object ) 活动对象,但是也是变量对象)
AO是VO的一个分支,都是变量对象
AO是活动对象,函数中的变量对象都称为AO

JS引擎执行过程

关于JS的引擎,大家应该都知道现在最著名的V8引擎了吧,V8引擎是现在chrome浏览器的JS引擎也是NodeJs的引擎。那么这个引擎究竟是何方神圣呢?其实就是一个堆和一个栈。说详细一点就是一个内存堆和一个调用栈,那么下图就是JS引擎的一个模型图
在这里插入图片描述

在JS的调用栈中,说白了就是一个个函数的执行,在得到JS代码之后,首先会向栈底放入全局代码,然后遇到代码中的函数就会入栈该数并执行,基本类型的变量是直接存在栈里面的,引用类型存在堆内存中,引用类型在堆中的地址是存放在栈内的。首先将全局代码入栈,在执行它的时候,遇到了其他函数,就将函数入栈并执行,如果发现函数调用了其他的函数,再入栈执行,没有调用了,就在执行完后开始退栈。

JS引擎执行的三个阶段(敲重点):

1. 语法分析阶段
这个阶段是在JS代码加载完毕后最早开始执行,目的是为了检查JS代码的语法错误,如果检查到代码有语法错误,则抛出一个语法错误,若检查完毕且没有错误,则进入预编译阶段。
2. 预编译阶段
在全局环境和函数环境会创建一个相应的执行上下文,且在上下文中进行了三件事情
创建变量对象VO(Variable Object)、建立作用域链(Scope Chain)、确定this指向

创建变量对象要经过以下几步(变量提升)
(1)检查当前上下文中的函数声明,按照代码顺序查找当前上下文中的函数声明,并且将其提前声明,在当前上下文的VO中,以函数名称建立一个属性,该属性的值为这个函数的堆内存指针。
(2)检查当前上下文的变量声明,也是按照代码顺序进行查找,若找到,则在当前VO中,建立一个以该变量为名称的属性,并且初始化值为undefined 。

在此阶段,函数还没有执行,但是已经做好函数执行的准备工作,所以变量对象是无法访问的,在进入执行阶段后,变量对象中的变量属性就会被赋值,变量对象就会变成活动对象(ActiveObject),这些变量就可以进行访问了。

来,举个例子:

function main(a, b) {
  const c = 10
  function sub() {
    console.log(c)
  }
}
main(1, 2)
// 在调用栈的最底层有一个全局执行上下文,我们将其命名为mainEC,它的结构如下
mainEc = {
  VO: {
    arguments: { // arguments对象,真实情况不一定是对象,在浏览器中是类数组
      a: undefined, // 形参a
      b: undefined, // 形参b
      length: 2 // 参数长度为2
    },
    sub: <sub reference>, // sub函数及其指针
    c: undefined // 变量c
  },
  scopeChain: [], // 作用域链
  this: window // this指向
}

作用域链由当前执行上下文的VO或AO和上一层上下文的AO组成,一直到全局上下文的AO
来,举例子:

const num = 10
function main() {
  const a = 1
  function sub() {
    const b = 2 
    return a + b
  }
  sub()
}
main()

//sub函数的执行上下文
subEC = {
  VO: { // 变量对象
    b: undefined
  },
  scopeChain: [VO(subEC), AO(main), AO(global)], // 作用域链
  this: window // this指向
}

3. 执行阶段即事件循环
(1)首先,会把所有代码分为同步任务、异步任务两部分,同步任务会直接进入执行栈依次执行,异步任务会进入异步队列然后再分为宏任务和微任务。
(2)宏任务进入到 宏任务队列。微任务进入微任务队列。
(3)当执行栈内的任务执行完毕,会检查微任务队列,如果有任务,就全部执行,如果没有就执行下一个宏任务。

注意,每执行一个宏任务就清空微任务队列。所以宏任务是一个个执行,微任务是全部执行。


以下为代码执行内存示意图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1856819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文翻译 | SELF-RAG: 学习通过自我反思来检索、生成和评估

Akari Asai, Zeqiu Wu, Yizhong Wang, Avirup Sil, Hannaneh Hajishirzi 华盛顿大学&#xff0c;IBM人工智能研究院 摘要 尽管大语言模型&#xff08;LLMs&#xff09;具有非凡的能力&#xff0c;但是它们经常产生不符合事实的响应&#xff0c;因为它们只依赖于它们封装的参数…

Java 应用的性能优化技巧和方法

Java应用性能优化是一个复杂且多层次的过程&#xff0c;涵盖了从代码编写到系统架构&#xff0c;再到运行环境配置的各个方面。 一、代码优化 1. 合理的数据结构和算法 选择合适的数据结构和算法对提高应用性能至关重要。Java提供了丰富的数据结构和算法库&#xff08;如Jav…

猫咪也怕油腻?选对猫粮是关键!福派斯鲜肉猫粮守护猫咪健康

亲爱的猫友们&#xff0c;我们都知道&#xff0c;猫咪的饮食健康是每一个铲屎官都非常关心的问题。最近&#xff0c;有些猫友向我反映&#xff0c;他们给猫主子喂食的猫粮油脂比较大&#xff0c;不禁让人担心这对猫咪是否真的好。 1️⃣ 首先&#xff0c;让我们来聊聊油脂在猫粮…

设计模式原则——里氏替换原则

设计模式原则 设计模式示例代码库地址&#xff1a; https://gitee.com/Jasonpupil/designPatterns 里氏替换原则 继承必须确保父类所拥有的性质在子类中依然成立 与开闭原则不同的是开闭原则可以改变父类原有的功能&#xff0c;里氏替换原则不能修改父类的原有的性质&#…

Clickhouse 的性能优化实践总结

文章目录 前言性能优化的原则数据结构优化内存优化磁盘优化网络优化CPU优化查询优化数据迁移优化 前言 ClickHouse是一个性能很强的OLAP数据库&#xff0c;性能强是建立在专业运维之上的&#xff0c;需要专业运维人员依据不同的业务需求对ClickHouse进行有针对性的优化。同一批…

用友 【U8+】供应链-暂估方式

【U8+】供应链-暂估方式 知识点:三种不同暂估方式的应用 应用场景: 对于采购业务如果货到票未到时,需要对采购入库进行估价入账,等收到发票时再按发票的成本核算采购入库成本。系统提供了三种暂估方式:月初回冲、单到回冲和单到补差。 操作流程: l 单到回冲 跨月全…

FreeCAD属性机制原理分析

1.实现原理 FreeCAD定义了一套属性层次结构&#xff0c;最上层是Property基类&#xff0c;该类主要提供了外部访问属性的接口及两个成员变量&#xff1a;属性名称、属性状态及属性容器类PropertyContainer。具体的属性直接或间接继承Property类&#xff0c;属性类中主要记录属性…

【机器学习】半监督学习可以实现什么功能?

目录 一、什么是机器学习二、半监督学习算法介绍三、半监督学习算法的应用场景四、半监督学习可以实现什么功能&#xff1f; 一、什么是机器学习 机器学习是一种人工智能技术&#xff0c;它使计算机系统能够从数据中学习并做出预测或决策&#xff0c;而无需明确编程。它涉及到…

Conda创建与激活虚拟环境(指定虚拟环境创建位置)

1.Conda优势 Conda是一个开源的软件包管理系统和环境管理系统&#xff0c;主要用于在不同的计算环境中安装和管理软件包和其依赖项。它最初是为Python而设计的&#xff0c;但现在也可以用于管理其他语言的软件包。 Conda提供了对虚拟环境的支持&#xff0c;这使得用户可以在同…

想拥有一个独一无二的AI人物?Lora炼丹训练模型教程来啦

之前答应过大家放出来的Lora本地训练教程&#xff0c;终于写好啦。 会训练lora&#xff0c;代表着你可以生成属于你的独一无二的角色。 你可以让这个角色在各种不同背景的地方出现&#xff0c;可以让它摆出各种姿势&#xff0c;满足你的无限幻想。 还有的商家&#xff0c;用…

java之SSRF代码审计

1、SSRF漏洞审计点 服务端请求伪造&#xff08;Server-Side Request Forge&#xff09;简称 SSRF&#xff0c;它是由攻击者构造的 payload传给服务端&#xff0c;服务端对传回的 payload 未作处理直接执行后造成的漏洞&#xff0c;一般用于在内网探测或攻击内网服务。 利用&a…

Graalvm尝鲜使用

面试时遇到大佬提点了下在性能不足的机器上传统优化JVM调优已经作用不大的背景下&#xff0c;采用graalvm进行打包成二进制文件&#xff0c;脱离java虚拟机&#xff0c;性能提升20%到100%&#xff0c;因此实操记录下来&#xff0c;方便后续使用 1、前置预装 graalvm-ce-java17…

qt开发-12_QScrollArea

在 Qt 中&#xff0c;QScrollArea 是用于显示可以滚动内容的控件&#xff0c;通常用于处理视图中内容超出可见区域的情况。它提供了一种在有限的视窗内显示大量内容的解决方案&#xff0c;如显示大图像、长文本、多个小部件等。 常用方法和属性 setWidget(QWidget *widget)&am…

android在线阅读代码网站

android在线阅读代码社区&#xff1a; Android 1.6 到 Android 10 的源码&#xff1a; Android OS 在线源代码 - https://www.androidos.net.cn10.0.0_r6 - Android社区 - https://www.androidos.net.cn/ AndroidXRef https://cs.android.com/ https://cs.android.com/android…

容器之视角构件的演示

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_ne…

Shopline电商平台的对接流程

对接Shopline平台需要具备一定的技术能力&#xff0c;包括API开发经验、编程技能以及对电商平台运作的理解。此外&#xff0c;与Shopline平台的技术支持团队保持沟通&#xff0c;可以在遇到问题时获得帮助。对接Shopline平台的流程通常涉及以下关键步骤。 1.了解Shopline API文…

详解大模型是如何理解并使用 tools ?

前文 大家肯定对使用大模型的函数回调或者说 Tools 已经耳熟能详了&#xff0c;那么他们具体内部是如何运作的呢&#xff0c;本文就此事会详细给大家介绍具体的细节。 tools 首先是大家最熟悉的环节&#xff0c;定义两个 tool 的具体实现&#xff0c;其实就是两个函数&#…

WSL+Anconda(pytorch深度学习)环境配置

动机 最近在读point cloud相关论文&#xff0c;准备拉github上相应的code跑一下&#xff0c;但是之前没有深度学习的经验&#xff0c;在配置环境方面踩了超级多的坑&#xff0c;依次来记录一下。 一开始我直接将code拉到了windows本地来运行&#xff0c;遇到了数不清的问题&a…

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 置换检验是一种非参数统计方法&#xff0c;它不依赖于数据的分布形态&#xff0c;因此特别适…

99.9% 超高控制精度!混合量子芯片具备大规模生产潜力

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨沛贤/浪味仙 排版丨沛贤 深度好文&#xff1a;700字丨5分钟阅读 摘要&#xff1a;悉尼量子初创公司 Diraq 正与一个欧洲研发联盟展开合作&#xff0c;通过将量子比特与传统晶体管结合&…