堆栈内存

    let a = { n: 1 }
    let b = a
    a.x = a = { n: 2 }
    console.log(a.x);
    console.log(b);
  1. 浏览器打开一个页面,首先会从计算机的虚拟内存中分配两块内存出来

栈内存Stack[ECStack] 执行上下文栈
    + 供代码执行
    + 存储声明的变量和基本数据类型的值

堆内存Heap
    + 存储对象类型的值

  1. 默认在堆内存中,开辟一个空间[16进制地址],GO(global object)全局对象,存储了浏览器为js提供的内置API

  2. 创建一个全局的执行上下文EC(G)
        + 供全局代码代码执行的环境
        + 进栈执行
    执行上下文就是栈内存空间,在代码执行过程中,遇到声明变量,需要一个存放变量的地方-->变量对象 VO(全局执行上下文的变量对象)/AO(函数执行上下文的活动对象)

堆栈内存.png
   let a = b = 12
   // 相当于
   b = 12
   let a = b

正常:从右到左计算,只有a是let声明,b不带let
特殊:遇到优先级高的则优先处理

  • 除了EC(G) 还有函数执行上下文EC(F)以及块执行上下文EC(Block),这个等我学完之后过来补上
    debugger
    var a = 12
    let b = 13

全局上下文中

  • 基于var function声明的变量,没有放在VO(G)中,直接存储于GO中,作为window的成员
  • 基于let const声明的变量,放在VO(G)中

图中的Script就是VO(G),Global就是GO

Snipaste_2022-04-13_20-57-27.png

    // 以下代码为js引擎执行RHS查询,先看VO(G)再看GO,都没有会报错Uncaught ReferenceError: a is not defined
    console.log(c);

    // 直接在GO找,找不到报错undefined
    console.log(window.c);

    // 则不会报错,这是LHS查询,在非严格模式下,全局作用域会在GO上创建一个属性d,并赋值为2
    d = 2

你可能感兴趣的:(堆栈内存)