堆栈内存的作用

JS 中的内存堆内存和栈内存,所有堆栈内存的处理,浏览器会自行在内部执行

【栈内存】:

  • 提供一个供 JS 代码自上而下执行的环境(作用域,代码都是在栈内存中执行的)

  • 由于基本类型比较简单,它们都是直接在栈内存中开辟一个位置,直接把值存储进去的

【堆内存】:引用值对应的空间

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

堆内存的释放

让所有引用堆内存空间地址的变量赋值为 null 即可,当堆内存没有被任何的变量或者其他东西引用时,就会在浏览器执行垃圾回收的时候,被销毁掉。

堆内存释放后,里面存储的值也就会被释放掉。

栈内存的释放

全局作用域会在页面关闭或者刷新的时候释放。(栈内存释放后,存储在栈内存中的值也都会销毁。)

私有作用域:一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉,但是也有特殊的情况。

函数执行完成,当前形成的栈内存中,某些内容被栈内存意外的变量一直占用,此时栈内存不能释放,栈内存中存储的基本值也不会被释放,一直保存下来。最典型的就是闭包。

  1. var i = 1;
  2. function fn(i) {
  3. return function(n) {
  4. console.log(n + (++i));
  5. }
  6. }
  7. var f = fn(2); //=> i = 2
  8. f(3); //=>7, i = 2 n =3,执行 n + (++i) => 3 + 3 = 6
  9. fn(5)(6); //=>12, i = 5 n = 6,执行 n + (++i) => 6 + 6 = 12
  10. fn(7)(8); //=>16, i = 7 n = 8,执行 n + (++i) => 8 + 8 = 16
  11. f(4); //=>8, i = 3 n = 4,执行 n + (++i) => 4 + 4 = 8