堆栈

48 阅读2分钟

JS之所以能够在浏览器中运行,是因为浏览器给JS提供了执行的环境栈内存 浏览器会在计算机内存中分配一块内存,专门用来供代码执行=》栈内存ECStack(Execution Context Stack)执行环境栈,每打开一个网页都会生成一个全新的ECS。

详细定义:

提供一个供JS代码自上而下执行的环境(代码都在栈中执行)。

由于基本数据类型值比较简单,他们都是直接在栈内存中开辟一个位置,把值直接存储进去的,当栈内存被销毁,存储的那些基本值也都跟着销毁。

引用值对应的空间,堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。

存储引用类型值(对象:键值对, 函数:代码字符串),当内存释放销毁,那么这个引用值彻底没了,堆内存释放;

当堆内存没有被任何得变量或者其他东西所占用,浏览器会在空闲的时候,自主进行内存回收,把所有不被占用得内存销毁掉。

定义:

堆内存:存储引用数据类型值(对象:键值对, 函数:代码字符串)

栈内存: 提供JS代码执行的环境和存储基本类型值

释放:

堆内存释放: 让所有引用堆内存空间地址的变量赋值为null即可,没有变量占用这个堆内存了浏览器会在空闲的时候把他释放掉。

栈内存释放: 一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉,在栈内存中存储的基本值也都会释放掉;

但也有特殊不销毁的情况:

全局栈内存只有在页面关闭的时候才会被释放掉。

函数执行完成,当前形成的栈内存中,某些内容被栈内存以外的变量占用了,此时栈内存不能释放,一旦释放外面找不到原有的内容了。

总结:

一般来说栈内存是线性有序存储,容量小,系统分配效率高。

而堆内存首先要在堆内存新分配存储区域,之后又要把指针(地址值)存储到栈内存中,效率相对就要低一些了。

垃圾回收方面,

栈内存变量基本上用完就回收了,而推内存中的变量因为存在很多不确定的引用,只有当所有指向堆内存的指针全部销毁之后才会被垃圾回收。