美文网首页
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 : 棧内存+堆内存+内存释放

    棧内存和堆内存 棧内存:提供了一个供JS代码执行的环境全局作用域私有所拥域 堆内存:存储引用数据类型的数据函数数据...

  • 十一、闭包(堆栈内存释放问题)------ 2020-04-05

    1、堆内存释放问题: 2、栈内存释放问题:

  • JS 垃圾回收

    内存 JS 数据的存储地址分为栈内存和堆内存。 栈内存 堆内存 在 JS 存放数据的内存中又分为高位和低位,其中高...

  • 变量提升

    堆内存 & 栈内存 JS中的内存一共两种:堆内存和栈内存 堆内存 作用:用来存储引用数据类型值的内存空间叫做堆内存...

  • JS内存图

    画JS内存图可以有效的解决JS中的一些内存问题JS中内存分为2中:栈内存(Stack)跟堆内存(Heap)栈内存:...

  • js知识版图-数据类型

    一、js中内存分为栈内存、堆内存此处引申知识点:js中堆栈内存及函数处理机制 栈内存 从数据类型角度思考 栈内存 ...

  • 内存释放(堆内存)和作用域(栈内存)销毁

    内存释放(堆内存)和作用域(栈内存)销毁对象数据类型或者函数数据类型在定义的时候会首先开辟一个堆内存// 堆内存的...

  • 堆栈内存

    JS中的内存:堆内存和栈内存 堆内存是用来存储引用数据类型值的(例如:创建函数和创建对象,就像开辟一个堆内存,把代...

  • 【16】内存管理机制

    1. 内存:栈区间、堆区间 栈:栈上的内存是系统自动开辟,自动释放堆:堆上的内存需要手动开辟,手动释放。但在pyt...

  • iOS内存泄漏问题及解决方案

    内存泄漏 内存泄漏指的是程序中已动态分配的堆内存由于某些原因未能释放或无法释放,造成系统内存的浪费,导致程序运行速...

网友评论

      本文标题:js : 棧内存+堆内存+内存释放

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