堆内存

对象或者函数(引用数据类型) 在定义的时候都会开辟一个堆内存,堆内存有一个引用地址,如果外面有变量引用了这个地址,我们就说这个内存被占用了,不能被销毁了。如果想要销毁堆内存,将所有引用这个堆内存的对象或者函数都赋值为null(空指针)即可。如果堆内存没有任何东西被占用,那么浏览器会在空闲的时候把它销毁(垃圾回收)。

//开辟堆内存
var obj1 = {name:'hxj'};
//销毁堆内存
obj1 = null;

栈内存

  • 全局作用域

只有页面关闭的时候全局作用域才会销毁

  • 私有作用域

一般情况下函数执行时会形成一个新的私有作用域,当私有作用域中代码执行完成时,我们当前的作用域会主动的释放和销毁。

但是还是存在特殊情况的:

当前私有作用域中部分内存被作用域以外的东西占用了,那么当前这个作用域就不能销毁了

1.上图中xxxfff000这个私有作用域开辟了xxxfff111的堆内存,但是这个堆内存被全局作用域下的foo引用,所以xxxfff111不能销毁。因此xxxfff000这个私有作用域也不能销毁,导致xxxfff000中的num也不能销毁。

作用域不能销毁的情况:

函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其他的东西给接收了,这种情况下一般形成的私有作用域不能被销毁。

function fn() {var num = 100;return function () {}
}
var f = fn();//fn执行形成这个私有作用域不能被销毁

2.在一个私有作用域中给DOM元素事件绑定方法,一般情况下我们的私有作用域不能销毁。

var iDiv = document.getElementById('myId');
function fn() {iDiv.onclick = function () {console.log('click');}
}
fn();//fn不能被销毁

3.不立即销毁->fn返回的函数没有被其他东西占用,但是还是需要再执行一次,所以暂时不销毁,当返回的值执行完成后,浏览器会在空闲的时间把它销毁。

注意下面三个例子之间的区别

1.

function fn() {var num = 100;return function () {}
}
var foo = fn; // fn不销毁

2.

function fn() {var num = 100;return function () {}
}
fn();//fn会销毁

3.

function fn() {var num = 100;return function () {}
}
fn()();//fn不立即销毁

js内存释放和作用域销毁相关推荐

  1. CollectGarbage函数--JS清理垃圾,内存释放

    首先看一个内存释放的实例: <SCRIPT LANGUAGE="JavaScript"> <!-- strTest = "1"; for ( ...

  2. JS内存泄漏实例解析

    今天突然想到一个问题,let的块级作用域,以及闭包的变量引用功能很有意思(这脑洞咋联想到一起的,囧)..闭包的使用会影响浏览器的GC过程.那么: JS 对象什么时候会被自动回收? 如何使用正确使用闭包 ...

  3. Unity3D 内存 释放

    最转载自:http://cl314413.blog.163.com/blog/static/190507976201322713921743/ 近网友通过网站搜索Unity3D在手机及其他平台下占用内 ...

  4. JS内存泄漏与垃圾回收机制

    来源 | http://www.fly63.com/article/detial/10087 由于字符串.对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配.JavaScri ...

  5. 关于堆内存和栈内存释放

    js 中的内存分为堆内存和 栈内存 堆内存:存储引用类型值 (对象:键值对 函数:代码字符串) 栈内存: 提供JS代码执行的环境和存储基本类型值 堆内存释放 让所有引用堆内存空间地址的变量赋值给Nul ...

  6. js变量以及其作用域详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.变量的类型  Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量 ...

  7. JS基础篇之作用域、执行上下文、this、闭包

    前言:JS 的作用域.执行上下文.this.闭包是老生常谈的话题,也是新手比较懵懂的知识点.当然即便你作为老手,也未必真的能理解透彻这些概念. 一.作用域和执行上下文 作用域: js中的作用域是词法作 ...

  8. 有意思的 Node.js 内存泄漏问题

    作者:elvinpeng,腾讯 WXG 前端开发工程师 Node.js 使用的是 V8 引擎,会自动进行垃圾回收(Garbage Collection,GC),因而写代码的时候不需要像 C/C++ 一 ...

  9. vector的内存释放

    1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式 ...

最新文章

  1. 合并道路_资质改革已经确定!盘点被合并的资质!有这资质的要注意了
  2. 第三代基因测序技术革新 云计算的应用
  3. python程序实例源代码-Python 神经网络手写识别实例源码
  4. python一维列表的定义_数据结构-Python 列表(List)
  5. php网页连mysql_php - 如何在单个网页上连接多个MySQL数据库?
  6. Oracle:使用ASM自动存储管理, 严重推荐
  7. 仿小说蓝色小说网站导航引流网站源码 带手机版
  8. 自然语言处理中的预训练模型 —— 邱锡鹏老师的演讲记录
  9. xcode中遇到的英文名词(更新)
  10. 数据结构前三章简要笔记
  11. ad20中如何在pcb里查找器件,AD中原理图如何查找相应的元件?
  12. Java实现--身高预测
  13. 还记得愤怒的小鸟嘛?今天用Python给大家安排一波!
  14. 在线二维码生成工具html源码
  15. Validation框架的应用
  16. 微信开放平台开发常见错误(长期更新)
  17. 1000瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?
  18. 【考研】操作系统试题集合(含简述、选择、判断和填空题)
  19. 21、TWS API和IB中的新闻和公告
  20. Notes/Domino的未来在于

热门文章

  1. CorelDRAW VBA - 在图层上创建线性标注 Layer.CreateLinearDimension
  2. 使用PyMysql进行操作数据库(企业中也用于测试数据库)
  3. Flash开发 NAND,NOR和 Flash区别
  4. 超级网管员——网络应用
  5. 论文相关知识:集合论中关于偏序关系、偏序集、覆盖等关系
  6. Hexo NexT主题添加友链
  7. 调试之学生电源的使用
  8. 两步完成ubuntu18.04 下安装腾讯官网提供的QQ for linux
  9. 微信小程序与.net的ashx的数据通信
  10. P3540 [POI2012]SQU-Squarks