浏览器 堆栈操作

525 阅读2分钟

一、基本数据类型堆栈处理

  • 在经历 V8 引擎将纯文本的 JavaScript 转成机器码之后,浏览器就会在计算机当中申请开辟一段内存空间,专门用来执行js代码,而这个栈内存指的就是浏览器的执行环境栈(ECStack),里面存放不同的执行上下问,也就是说所有的执行上下文都会进栈执行

  • 全局执行上下文就管理全局代码的执行,某些局部执行上下文就管理他们自己的局部代码

  • VO(G),全局变量对象,所有在全局声明的变量都存放到这个对象中,是在全局执行上下文中的

  • 在不考虑变量提升的情况下,画图来解释一下

image.png

image.png

二、引用数据类型堆栈处理

image.png

image.png

三、函数堆栈处理

  1. 创建函数和创建变量类似,函数名可以看作是一个变量名,存放在 VO 当中,同时它的值就是当前函数对应的内存地址

  2. 函数本身也是一个对象,创建函数时会单独开辟一个堆内存用于存放函数体(字符串形式的代码),该内存地址也会有一个16进制的数值地址

  3. 创建函数的时候,他的作用域就已经确定了(也就是创建函数时,它所在的执行上下文已经确定)

  4. 函数执行就是将它堆内存中的字符串形式的代码进行执行,执行代码就肯定得有一个新的环境,所以此时就会生成一个全新的私有执行上下文来管理函数体当中的代码,它里面有一个 AO 用来管理这个上下文中的变量

  5. 函数执行时会先确定作用域链(也就是当前执行上下文,上级执行上下文),确定 this,初始化 arguments 对象,形参赋值(它就相当于是变量声明,然后将声明的变量放到AO),变量提升

四、闭包堆栈处理

  1. 闭包是一种机制,通过私有上下文来保护当中变量的机制,也可以认为当我们创建的某一个执行上下文在函数执行完之后不被释放掉的时候,就形成了闭包

  2. 闭包可以保存数据,让当前上下文中的变量被其作用域之外的函数或变量去使用