Jex
05-JS内存

05-JS内存

JS中内存分类

  • 栈内存

用来提供一个供JS代码执行的环境,也就是作用域(全局作用域/局部作用域)

  • 堆内存

用来储存引用数据类型的值,对象储存的是属性名和属性值,函数储存的是代码字符串(待考究)

堆内存

对象数据类型/函数数据类型在定义时会开辟一个堆内存,堆内存地址值被外界所引用的话,我们就说这个内存被占用,不能被销毁了。

  • 内存释放(垃圾回收)

想让堆内存被释放,只需要把所有引用它的变量赋值为 null 即可。如果当前的堆内存没有被引用,那么浏览器中空闲的时候会把它销毁。

栈内存(作用域)

  • 全局作用域:不销毁的作用域,只有浏览器关闭的时候才会释放。
  • 局部作用域(只有函数执行才会产生局部作用域):
    • 一般情况下,当局部作用域中的代码执行完毕后,当前的局部作用域都会主动地进行释放和销毁。
    • 特殊情况下,当局部作用域中部分内容被当前作用域以外的东西占用了,那么当前这个作用域就无法被销毁:
      • 函数执行返回了一个引用数据类型,并且在函数外面被其他变量接收(闭包)。
      • 在局部作用域给DOM元素事件绑定方法,局部作用域一般也不销毁。
      • 函数返回的引用数据类型没有被其他变量引用,但还需要执行一次(自执行函数),所以不立即销毁。当返回值执行完成后,浏览器会在空闲的时候销毁。

练习题

var fn = function () {
  var i = 10;
  return function (n) {
    return n + (++i)
  }
}

var f = fn()

f(10) // 21
f(20) // 32
fn()(10) // 21
fn()(20) // 31

内存分析图示意如下: