JS进阶(二)JS底层运行机制之堆栈内存

简介: 1.JS底层运行机制之堆(Heap)栈(Stack)内存相关理论知识ECStack(Execution context Stack) 执行环境栈: —— 内存中分出来用于执行js代码的空间EC(Execution context): —— 执行上下文, 为了区分全局和函数执行所处的不同范围(词法作用域),又可以分为全局执行上下文EC(G)和函数执行私有上下文EC(FUNC)作者:重阳微噪链接:https://juejin.cn/post/6850418109707190285来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.JS底层运行机制之堆(Heap)栈(Stack)内存

相关理论知识

  • ECStack(Execution context Stack) 执行环境栈: —— 内存中分出来用于执行js代码的空间
  • EC(Execution context): —— 执行上下文, 为了区分全局和函数执行所处的不同范围(词法作用域),又可以分为全局执行上下文EC(G)函数执行私有上下文EC(FUNC)
  • VO(Varilbale Object)和AO(Active Object):  —— 在每一个上下文代码执行的时候,都可能会创建变量 , 全局变量对象VO(Varilbale Object) 和 私有变量对象AO (Active Object)
  • GO(global object):  内置、全局对象,——浏览器把所有供后期需要供JS调取使用的属性和方法都放在GO对象中,如setInterval、eval、JSON并且创建一个window对象指向它,使用的时候可以省略window,如window.console.log=> console.log1733cb1822be28d7_tplv-t2oaga2asx-zoom-in-crop-mark_4536_0_0_0.png
    let a = 12;
    let b = 13;
    function func(){
       let a = 1;
       let b = 3;
    }
    console.log( a,b )   // 12 ,13
    // 由上图我们可以得知函数中的a、b变量存到了AO(FUNC)中,函数外的a、b存到了VO中,所以函数取到的应该是VO中的12,13

代码执行阶段

  • 创建变量并赋值的过程【3步】 1、先创建值 基本类型的值直接存储到栈内存中 引用数据类型需要开辟一个堆内存, 把堆内存地址存放到栈中供变量调用 2、创建变量,存储在变量对象中 3、关联,让变量和值进行关联(指针指向的过程)
  • 对象中属性名的类型 【说法一,属性名类型只能是字符串或者Symbol】 【说法二,属性名类型可以是任何基本类型值,处理中可以和字符串互通】 但是属性名绝对不能是引用数据类型,如果设置为引用数据类型,最后也是转换为字符串来处理的, 属性名应该是一个值
  for(let key in obj){}  
  // For In 遍历中获取的属性名都会变成字符串,并且不会迭代   到属性为Symbol类型的属性
  var a ={} , b ="0" , c =0;
  a[b] = "蓝天"
  a[c] ="白云"
  console.log(a[b])  // 白云
  var a ={} ,
        b = Symbol("1") ,
        c =Symbol("1") ;
  a[b] = "蓝天"
  a[c] ="白云"
  console.log(a[b])  // 蓝天
  var a ={} ,
        b = { n:'1' } ,
        c = { m:'2' } ;
  a[b] = "蓝天"
  a[c] ="白云"
  // a['[object Object]']
  console.log(a[b])  // 白云
  //  连等赋值
  let a = 12,
       b = 13;
       => let a =12; let b =12;
  let a = b = 12; 
   // 默认从右到左
   // 1、创建一个值12
   //  2、b = 12;
   //  3、let  a = 12;
   [mdn 运算符优先级](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)
  a.x  = a  ={};
  a = a.x = {};
  因为a.x的优先级是很大的,不管怎么调换位置,都是先处理a.x = {}
  var a = {
    n : 1
  }
  var b = a;
   a.x = a = {
      n : 2
  }
  console.log(a.x)  // undefined
  console.log(b)    // { n:1 , x: {n:2} }
  // 解析: 1、先创建值: 引用类型,开辟堆空间存{n:1}, 引用为16进制的地址如AAFFCC

思考题

var x = [12,23];
function fn(y) {
   y[0] = 100;
   y = [100];
   y[1] = 200;
   console.log(y)
}
fn(x);
console.log(x)

写在最后

欢迎访问我的博客rockshang.com

相关文章
|
9天前
|
存储 JavaScript 前端开发
JS 中的内存管理
【10月更文挑战第17天】了解和掌握 JavaScript 中的内存管理是非常重要的。通过合理的内存分配、及时的垃圾回收以及避免内存泄漏等措施,可以确保代码的高效运行和稳定性。同时,不断关注内存管理的最新发展动态,以便更好地应对各种挑战。在实际开发中要时刻关注内存使用情况,以提升应用的性能和质量。
17 1
|
14天前
|
存储 JavaScript 前端开发
深入理解JavaScript中的事件循环(Event Loop):机制与实现
【10月更文挑战第12天】深入理解JavaScript中的事件循环(Event Loop):机制与实现
44 3
|
20天前
|
存储 监控 算法
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
|
21小时前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
9 6
|
22小时前
|
JavaScript 前端开发 Java
JavaScript 中内存泄漏的几种常见情况
【10月更文挑战第25天】实际上还有许多其他的情况可能导致内存泄漏。为了避免内存泄漏,我们需要在开发过程中注意及时清理不再需要的资源,合理使用内存,并且定期检查内存使用情况,以确保程序的性能和稳定性
8 2
|
1天前
|
存储 算法 Java
Go语言的内存管理机制
【10月更文挑战第25天】Go语言的内存管理机制
6 2
|
2天前
|
消息中间件 JavaScript 中间件
深入浅出Node.js中间件机制
【10月更文挑战第24天】在Node.js的世界里,中间件如同厨房中的调料,为后端服务增添风味。本文将带你走进Node.js的中间件机制,从基础概念到实际应用,一探究竟。通过生动的比喻和直观的代码示例,我们将一起解锁中间件的奥秘,让你轻松成为后端料理高手。
|
3天前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
15 1
|
4天前
|
存储 JavaScript 前端开发
js 中有哪几种内存泄露的情况
JavaScript 中常见的内存泄漏情况包括:1) 全局变量未被释放;2) 意外的全局变量引用;3) 被遗忘的计时器或回调函数;4) 事件监听器未被移除;5) 子元素存在时删除父元素;6) 循环引用。
|
14天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。