在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制。

  在初识闭包一文中我说过js中有回收机制这么一回事,让我们一起回顾一下,并且深入的了解js中的回收机制到底是怎么一回事。

function a(){
  var num = 10;
  return function(){
    num ++;
    console.log(num);
  }
}
a()(); //11
a()(); //11

按理说第二次执行函数a的时候应该打印出12才对,但是打印的却是11,这难道不能说明js在这其中做了什么手脚吗?按照正常逻辑我们一起来分析分析。

首先来看看我们的理解

  //我们在函数a中返回了一个匿名函数,在这个匿名函数中我们num++了一下,然后我们在函数外面执行了这个匿名函数函数,(第一括号执行函数a第二个括号执行这个rutrun回去的函数)

  //现在num是11,然后我们又执行了一次这个函数,你们应该是12吧,为什么不是呢?

-------------------------------------实际js的执行-----------------------------------

  但是js的设计者为了让没有必要的变量保存在内存中,(我们写的任何变量都是需要内存空间的),什么叫没有必要的变量?也就是说你不在需要这个变量的时候它就会被销毁?那么你肯定会问js怎么知道那些变量是我们不需要的哪些是我们需要的。所以js为了知道哪些变量需要保存下来,哪些不需要保存下来,会进行一些判断。接下来我们就一起看看js是怎么判断的。

  1.在js中定义的全局变量是不会被销毁的,因为我们随时都可能会用到这个变量,所以不能被销毁。

  2.但是在函数中定于的变量就不一定了,而且由于在函数的定义的变量的生命周期在执行完这个函数就销毁的原因自然就保存不了上一次的值。

    2.1但是并不是说函数就真的保存不了上一次的值,因为有的时候我们确实需要上一次的值,所以js判断是否需要保存上一次变量的值的时候就会遵守这样的一个规则。

规则

  如果这个函数有被外部的变量引用就不会销毁(这句话说的不够准确,下面代码会一步一步解释),否则销毁。怎么理解这句话呢?

function a(){
var b = 0;
return function(){
b ++;
console.log(b);
}
} var d = a();
d();//1
d();//2

  函数a被变量变量d引用,更准确的说是函数a里面的那个匿名被变量d所引用,因为变量d等于的是函数a执行完成后的值,而函数a执行完以后又因为函数a返回了那个匿名函数,所以准确的说是变量d等于匿名函数。而这个匿名函数因为使用了函数a中的变量b并且还被变量d所引用,所以就形成了一个闭包,只要这个变量d不等于null的话,那么那个变量b会一直保存到变量d中不会被销毁。

  总结:

    1、如果一个对象不被引用,那么这个对象就会被GC回收;
    2、如果两个对象互相引用,但是没有被第3个对象所引用,那么这两个互相引用的对象也会被回收。

  如果你想更加深入学习闭包,那么我推荐你看一下关于在for循环中绑定事件打印变量i是最后一次的问题这篇文章。

 
 

最新文章

  1. 在同台电脑上再次安装MySql需要注意的事项
  2. JSP动作标签
  3. 解决版本冲突-使用SVN主干与分支功能
  4. iOS - 指定视图的圆角个数-b
  5. css文件加载:@import和link的区别
  6. cloudstack的ZONE删除不掉?来这招吧
  7. mysql rr和rc区别
  8. android AIDL RPC 机制
  9. wp rest api 授权方法步骤(使用JWT Authentication插件)
  10. cf949C 建模,SCC缩点
  11. 一个完整的Java程序示例
  12. 初识C语言中的函数(男神翁凯老师MOOC)
  13. Python3实战系列之三(获取印度售后数据项目)
  14. Linux文件权限查看及修改命令chmod,chown
  15. 深入一点 让细节帮你和Fragment更熟络
  16. JAVA-JVM垃圾回收算法
  17. wireshark的一些快捷键
  18. 获取ip地址以及获取城市等信息
  19. CSS让内部元素以相反的顺序显示
  20. python应用:经纬度匹配

热门文章

  1. 爬虫开发5.requests模块的cookie和代理操作
  2. day9学python 类+异常处理+初识socket
  3. [Swift]字符串(String类、NSString类)常用操作
  4. 20 行代码极速为 App 加上聊天功能
  5. TortoiseSVN查看修改时报错的解决方法
  6. iOS 本地时间、UTC时间、时间戳等操作、获取当前年月日
  7. C#-WinForm-★★★★★跨窗体 构造函数传值 及应用—登录式窗口传值、如何关闭主页面时关闭应用程序、如何打开唯一窗口★★★★★
  8. vue关闭令人抓狂的ESlint 语法检测配置方法
  9. 【医学影像】《Identifying Medical Diagnoses and Treatable Diseases by Image-Based Deep Learning》论文笔记
  10. /data/tomcat8/bin/setenv.sh