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

相关文章
|
14天前
|
Web App开发 存储 监控
Node.js中的内存泄漏
【8月更文挑战第31天】Node.js中的内存泄漏
32 1
|
20天前
|
Java 容器
【Azure Function App】Java Function在运行中遇见内存不足的错误
【Azure Function App】Java Function在运行中遇见内存不足的错误
|
22天前
|
存储 程序员 编译器
堆和栈内存的区别是什么
【8月更文挑战第23天】堆和栈内存的区别是什么
55 4
|
22天前
|
JavaScript 前端开发 算法
js 内存回收机制
【8月更文挑战第23天】js 内存回收机制
30 3
|
22天前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
20 3
|
23天前
|
存储 缓存 NoSQL
Redis内存管理揭秘:掌握淘汰策略,让你的数据库在高并发下也能游刃有余,守护业务稳定运行!
【8月更文挑战第22天】Redis的内存淘汰策略管理内存使用,防止溢出。主要包括:noeviction(拒绝新写入)、LRU/LFU(淘汰最少使用/最不常用数据)、RANDOM(随机淘汰)及TTL(淘汰接近过期数据)。策略选择需依据应用场景、数据特性和性能需求。可通过Redis命令行工具或配置文件进行设置。
36 2
|
29天前
|
存储 缓存 编译器
Linux源码阅读笔记06-RCU机制和内存优化屏障
Linux源码阅读笔记06-RCU机制和内存优化屏障
|
30天前
|
存储 JavaScript 算法
|
1月前
|
设计模式 uml
在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Hard
该博客文章通过一个电脑主机启动的示例代码,展示了外观模式(Facade Pattern)的设计模式,其中主机(MainFrame)类通过调用内部硬件组件(如内存、CPU、硬盘)和操作系统的启动方法来实现开机流程,同时讨论了外观模式的优缺点。
|
13天前
|
JavaScript 中间件 开发者
深入浅出Node.js中间件机制
【8月更文挑战第31天】本文将带你领略Node.js中间件的奥秘,通过直观的案例分析,揭示其背后的设计哲学。你将学会如何运用中间件构建强大而灵活的后端应用,以及在面对复杂业务逻辑时如何保持代码的清晰与高效。