JavaScript高架(二)-V8引擎下

 书归上回

  • ECS(Execution Context Stack)

V8引擎为了执行代码, V8引擎内部会有一个执行上下文栈Execution Context Stack(ESC函数调用栈),当首次加载JS的时候就会创建一个Execution Context Stack(ECS),它是用于执行代码的调用栈,它第一次执行的是全局代码块

  • GEC (Global Execution Context)

全局代码块为了运行,会构建一个Global Execution Context(GEC)GEC会被放入Execution Context Stack(ESC) 中执行

  • FEC (Functional Execution Context) 在执行的过程中执行到一个函数时,就会根据函数体创建一个函数执行上下文 (Functional Execution Context),并且压入到EC Stack中。FEC中包含三个部分。

第一部分:解析函数成为AST树结构时,会创建一个Activation Object(AO):AO中包含形参、arguments、函数定义和指向函数对象、定义的变量;

第二部分:作用域链:由VO(在函数中就是AO对象)和父级VO组成,查找时会一层层查找

第三部分:this指向,根据不同的情况绑定不同的this

  • GO (Global Object)

    堆内存中创建的全局对象,该对象 所有的作用域(scope)都可以访问,里面会包含Date、Array、String、Number、setTimeout、setInterval等等,其中还有一个window属性指向自己,这也就是为什么可以console.log(window.window.window)因为它始终是指向自己的。

  • AO (Activation Object)

    执行上下文,AO对象函数执行的前一刻,会创建一个称为执行期上下文的内部对象(AO) 函数中的VO指向的就是AO+父级的VO。

  • VO (Varable Object)

    早期ECMA版本规范,每个执行上下文会被关联到一个变量对象(Varable Object),在源代码中的变量和函数声明会被作为属性添加到VO中,对于函数来说,参数也会被添加到VO(变量对象)中。

    全局VO对应GO 函数VO对应AO

  • VE (VariableEnvironment)

    在最新的ECMA版本规范中,对于一些词汇进行了修改。每个执行上下文会被关联到一个变量环境(VariableEnvironment)中,在执行代码中变量和函数的声明会作为函数记录添加到变量环境中,对于函数来说,参数也会被添加到VE(变量环境)中。

JS中内存管理

JS对于基本数据类型内存的分配在执行时,会分配在栈空间;对于引用类型的内存分配在执行时,会分配在堆空间

因为内存的大小是有限的,所以当内存不再需要的时候,我们需要对其进行释放,以便腾出更多的内存空间。

垃圾回收机制

垃圾回收的英文是Garbage Collection,简称GC。

GC算法-引用计数

当一个对象有一个引用指向它时,那么这个对象的引用就+1,当一个对象的引用为0时,这个对象就可以被销。这个算法有一个很大的弊端就是会产生循环引用,例子:闭包。

解决方案是obj1.info = null 但是在实际开发中很少能够注意到。

GC算法-标记清除

这个算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找所有从根开始有引用到的对象,对 于哪些没有引用到的对象,就认为是不可用的对象,这个算法可以很好的解决循环引用的问题。

JS引擎比较广泛的采用的就是标记清除算法,当然类似于V8引擎为了进行更好的优化,它在算法的实现细节上也会结合 一些其他的算法。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式和 Java 走哪条路?

最近看到一个物联网大三学生的疑问,原话如下: 本人普通本科物联网工程专业,开学大三,现在就很迷茫,不打算考研了,准备直接就业,平时一直在实验室参加飞思卡尔智能车比赛,本来是想走嵌…

Arcgis 导入经纬度坐标、导出经纬度坐标

目录 一、导入经纬度坐标 1、在excel中准备好经纬度坐标的数据表 2、将数据放入Acrgis的工作路径 3、在arcgis中添加数据 4、显示经纬度坐标点 5、导出为shp矢量文件 二、根据shp的经纬度坐标点导出成经纬度坐标 1、右键选择打开属性表 2、在属性表的菜单下拉栏里找到…

软考中级——软件设计师真题中的一些知识总结

2023年5月考过了软考中级——软件设计师,一次通过,两科成绩分别是入下。 做上午真题的时候积累了一些易错题,分享一下~~ 2014年5月 1、木马程序:是一种寻找计算机后门,伺机窃取被控计算机中的密码和重要文件等&#…

微服务(基础篇-006-Docker)

Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间没有任何接口(类似 iPhone 的 app&…

力扣热门算法题 135. 分发糖果,146. LRU 缓存,148. 排序链表

135. 分发糖果,146. LRU 缓存,148. 排序链表,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.28 可通过leetcode所有测试用例。 目录 135. 分发糖果 解题思路 完整代码 Python Java 146. LRU 缓存 …

LabVIEW开发及系统集成--实验室科研篇

LabVIEW开发及系统集成--实验室科研篇 自2005年成立以来,北京瀚文网星科技有限责任公司致力于提供专业的LabVIEW开发及系统集成服务。公司凭借丰富的行业经验和深刻的客户洞察,为客户提供快速、高效且性价比极高的解决方案。 LabVIEW在实验室应用中提供…

【uniapp】uniapp实现免密登录

文章目录 一、概要二、整体架构流程三、技术名词解释四 、技术细节1.存取token有效期?2.使用setStorageSync而不使用setStorage?3.使用onLaunch而不使用全局路由? 一、概要 打开一个网页或小程序的时候,我们有时候会自动进入主页…

Python学习之-正则表达式

目录 前言:1.re.serach1.1例子: 2.re.match2.1示例1:2.2 示例2: 3.re.findall3.1 示例 4.re.fullmatch4.1 示例1:4.2 示例2: 5.re.split5.1 示例1:5.2 示例2:5.3 示例3: 6.re.sub6.1 示例&#…

【Java程序设计】【C00387】基于(JavaWeb)Springboot的校园食堂订餐系统(有论文)

基于(JavaWeb)Springboot的校园食堂订餐系统(有论文) 项目简介项目获取开发环境项目技术运行截图 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过…

|行业洞察·电商|《2024互联网综合电商行业及营销趋势报告-21页》

|趋势洞察库| 关注我 主页个人介绍 查看完整报告 报告的主要内容解读: 互联网综合电商行业概述及品牌分布: 电子商务市场已从高速增长阶段进入成熟发展阶段,2022年交易额增长速度整体放缓。综合电商平台可以分为货架电商、社交电商、即时电…

数据结构/C++:位图 布隆过滤器

数据结构/C:位图 & 布隆过滤器 位图实现应用 布隆过滤器实现应用 哈希表通过映射关系,实现了O(1)的复杂度来查找数据。相比于其它数据结构,哈希在实践中是一个非常重要的思想,本博客将介绍哈希思想的两大应用,位图…

c# 跳转搜索(Jump Search)

与二分搜索一样,跳转搜索是一种针对排序数组的搜索算法。基本思想是通过按固定步骤向前跳跃或跳过某些元素来代替搜索所有元素来检查更少的元素(比线性搜索)。例如,假设我们有一个大小为 n 的数组 arr[] 和一个大小为 m 的块&…