js : 棧内存+堆内存+内存释放

棧内存和堆内存

  • 棧内存:提供了一个供JS代码执行的环境
    • 全局作用域
    • 私有所拥域
  • 堆内存:存储引用数据类型的数据
    • 函数数据类型:存代码字符串
    • 对象数据类型:存键值对

内存释放

棧内存的形成和释放

  • 全局作用域
    • 形成:当浏览器加载完页面的时候,全局作用域形成
    • 销毁 / 释放:关闭页面,关闭浏览器,关闭电脑...
  • 私有作用域
    • 当函数被调用的时候,形成私有作用域
    • 销毁:一般当函数执行完成的时候,私有作用域就释放了,但是特殊情况除外;
      • 不释放:如果函数中的东西,被外面的变量或其他的东西占用的时候,就无法释放
      • 不立即释放:最典型的就是当函数执行完成的时候,返回一个函数的定义阶段,这个丁一阶段,还要再执行一次,当两次都执行完成的时候,私有作用域得到释放;
堆内存的形成和释放
  • var obj = {} // 形成
  • var fn = function(){} // 形成
  • obj = null // 释放
  • fn = null // 释放

垃圾回收机制

浏览器每隔一段时间,都会回收没用的内存,所以当我们不用哪个地址的时候,可以把占用这个地址的东西,执行空指针null,这样,等浏览器空闲的时候,就会把这个内存进行回收;

函数的定义 3 步骤

  1. 开辟一个空间地址
  2. 把函数体内所有的JS代码,作为字符串存在这个空间中
  3. 把这个空间地址赋值给函数名

函数的调用 4 步骤

  1. 形成一个私有作用域
  2. 形参赋值
  3. 预解释
  4. 代码从上到下执行

带var和不带var的区别

  • 带var的:1)私有变量2)会进行预解释
  • 不带var的:1)如果是设置,找不到,window.a = XXX;如果是获取,找不到,报错! XXX is not defined;2)不会进行预解释

作用域链

当函数被调用的时候,会形成一个私有作用域,看这个私有作用域中,是否有变量a,
1)如果有,该函数中所有的a都为私有变量
2)如果没有,往上级查找,一直找到window,还没有的话,报错 a is not defined

上级作用域

  • 上级作用域跟函数在哪里调用无关,只跟函数队形的堆内存在哪个空间下开辟有关;

你可能感兴趣的:(js : 棧内存+堆内存+内存释放)