JS--对战内存及函数底层处理机制

61 阅读1分钟

JS中的堆(Heap)栈(Stack)内存

都是在计算机内存中开辟的空间

  • 栈内存 Stack:ECStack(Execution [ˌeksɪˈkjuːʃn] Context Stack)

    • 存储原始值类型值
    • 代码执行的环境
  • 堆内存 Heap:

    • 存储对象类型值

EC(Execution [ˌeksɪˈkjuːʃn] Context )执行上下文:区分代码执行的环境

  • 常见上下文分类:

    • 全局上下文 EC(G)
    • 函数私有上下文 EC(?)
    • 块级私有上下文 EC(BLOCK)
  • 产生私有上下文 -> 进栈执行 -> 出栈释放(可能释放)

  • 变量对象:当前上下文中,用来存储声明的变量的地方

    • VO(Varibale Object):VO(G) 或者 VO(BLOCK)全局变量对象
    • AO(Active Object):AO(?)

image.png

GO(Global Object)全局对象

  • window 指向 GO 对象
  • 全局上下文中,基于var/function声明的变量是直接存储到GO对象上的;而基于let/const声明的变量才是存放在VO(G)中的;

let 变量 = 值 的操作步骤

  • 第一步:创建值

    • 原始值类型:直接存储在栈内存中,按值操作

    • 对象类型值:按照堆内存地址来操作

      • 对象:开辟一个堆内存空间(16进制地址)、依次存储对象的键值对、把空间地址赋值给变量

      • 函数:内存空间中存储三部分信息

        • 作用域 [[scope]]:当前所处上下文
        • 函数体中的代码字符串
        • 当做普通对象存储的静态属性和方法「name & length」
  • 第二步:声明变量 declare

  • 第三步:变量和值关联在一起(赋值) defined

image.png

image.png