美文网首页
堆栈内存

堆栈内存

作者: maomizone | 来源:发表于2022-04-13 20:39 被阅读0次
        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
    

    相关文章

      网友评论

          本文标题:堆栈内存

          本文链接:https://www.haomeiwen.com/subject/zwoasrtx.html