程序都自己的内存,一旦内存过多就会清楚以前的缓存。所以,在写代码的时候,不要仅仅只会推变量到栈中,还要会将变量从栈中释放。

那么问题来了,我们应该如何将内存从栈中释放呢?

要释放变量,那就要从javaScript的垃圾收集机制开始学习了。

javaScript的垃圾收集机制有两种

1.标记清除

这是JavaScript最常用的方法。这个方法就是当一个变量进入环境中,设置一个标记位给变量,当他离开环境时,反转这个标志位。然后垃圾收集机制在间隔一段时间重复执行,他会回收那写标志位被反转的变量。

2.引用计数

这个方法就是给进入环境的变量加个数量来标志他被引用的次数,当被引用的时候这个次数加1,相反,如果包含这个变量引用的变量又取其他的值,则次数减1。然后垃圾收集机制在间隔一段时间重复执行,他会回收那个标志次数为0 的变量。

ie在之前的版本,垃圾回收机制是根据内存分配量运行的,当环境中存在 256 个变量、4096 个对象、64K 的字符串任意一种情况的时候就会触发垃圾回收器工作。这不符合开发,万一项目大了怎么操作呢?

因此之后改版就是触发条件不再是固定的,而是动态修改的,初始值和IE6相同,如果垃圾回收器回收的内存分配量低于程序占用内存的 15%,说明大部分内存不可被回收,设的垃圾回收触发条件过于敏感,这时候把临界条件翻倍,如果回收的内存高于 85%,说明大部分内存早就该清理了,这时候把触发条件置回。

说了这么多,还没又讲如何手动回收变量?

function example() {
return ;
}
var num = example();
// 人工解除example的引用
num = null;

不过,解除一个值的引用并不意味着自动回收改值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

以上是es5的方法。因为ES6 考虑到了这一点,推出了两种新的数据结构:WeakSet 和 WeakMap。它们对于值的引用都是不计入垃圾回收机制的,所以名字里面才会有一个"Weak",表示这是弱引用。

const wm = new WeakMap();

const element = document.getElementById('example');

wm.set(element, 'some information');
wm.get(element) // "some information"

上面代码中,先新建一个 Weakmap 实例。然后,将一个 DOM 节点作为键名存入该实例,并将一些附加信息作为键值,一起存放在 WeakMap 里面。这时,WeakMap 里面对element的引用就是弱引用,不会被计入垃圾回收机制。

也就是说,DOM 节点对象的引用计数是1,而不是2。这时,一旦消除对该节点的引用,它占用的内存就会被垃圾回收机制释放。Weakmap 保存的这个键值对,也会自动消失。

基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。

想要深入学习的童鞋,可以去看阮老师的es6。

最新文章

  1. HTML5- Canvas入门(五)
  2. 前端开发必学技能之一———非关系数据库又像关系数据库的MongoDB快速入门第一步下载与安装
  3. ORACLE中的DECODE函数
  4. android 解决.XML提示ava.lang.NullPointerException at错误后XML没显示
  5. java -日期
  6. dede 调用四级导航
  7. <三> SQL杂七杂八
  8. java中通过类名实例化类
  9. sql server 2008有关SQL的模糊查询
  10. Oracle中merge into的使用 (转)
  11. JSP简单的练习-使用JDOM阅读xml文件
  12. 动态注册HttpModule
  13. xxe漏洞的学习与利用总结
  14. 【Centos7】5分钟理解防火墙firewalld
  15. MySQL数据库分区的概念与2大好处(1)
  16. 商品详情页系统的Servlet3异步化实践
  17. Spark应用HanLP对中文语料进行文本挖掘--聚类详解教程
  18. [转] libcurl异步方式使用总结(附流程图)
  19. 使用robot封装一个模拟键盘复制粘贴并按下回车的方法
  20. 减小App包的大小

热门文章

  1. Kibana error " Fielddata is disabled on text fields by default. Set fielddata=true on [publisher] ..."
  2. 精简的网站reset和css通用样式库
  3. linux学习3(vim)
  4. shell编程中
  5. jsonp跨域请求及本质
  6. 使用xUnit为.net core程序进行单元测试
  7. JavaScript base64多图上传
  8. strcpy/strlen/strcat/strcmp的实现
  9. 使用cucumber & selenium实现一个简单的bddtest
  10. Unity GetComponents获取组件