美文网首页
js : 棧内存+堆内存+内存释放

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

作者: Dream_丹丹 | 来源:发表于2017-07-19 20:02 被阅读0次

    棧内存和堆内存

    • 棧内存:提供了一个供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 : 棧内存+堆内存+内存释放

          本文链接:https://www.haomeiwen.com/subject/gvcrkxtx.html