JS中内存分类

  • 栈内存

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

  • 堆内存

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

堆内存

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

  • 内存释放(垃圾回收)

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

栈内存(作用域)

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

练习题

  1. var fn = function () {
  2. var i = 10;
  3. return function (n) {
  4. return n + (++i)
  5. }
  6. }
  7. var f = fn()
  8. f(10) // 21
  9. f(20) // 32
  10. fn()(10) // 21
  11. fn()(20) // 31

内存分析图示意如下:
05-JS内存 - 图1