在前面的几篇文章中,我讲解过了js中的回收机制,但是对于当时的我来说,我自己对回收机制的这个概念也有些懵懵懂懂,现在对回收机制有了更深入的理解,所以特此发布此文给于总结,也好加深记忆。

  如果你想学习闭包那么js中的回收机制是必不可少的,当然学习闭包除了需要理解js中的回收机制以外还需要了解其他的概念,我的其他文章有相关的说明,这里不做闭包的讲解。

  为什么要有回收机制?why?

    打个比方,我有一个内存卡,这个内存是8G的,我把文件,视频,音乐,都保存到了这个内存卡,随着我的储存的内容越来越多,这个内存卡已经保存不了了,如果我还想再把其他的文件保存到这个内存卡就需要删除一些文件,但是这些被删除的文件是我们自己手动删除的对吧,手动删除就相当于js中的delete。

  在这些程序语言中同样也会出现这些问题,对,内存!我们声明的任何变量都需要消耗内存,这些变量越多运行的速度也会越慢。当然不只是变量,代码中的任何东西。这些语言的设计者为了解决这些问题,设计了一套代码的回收规则。

  

  代码回收规则如下:

    1.全局变量不会被回收。

    2.局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。

    3.只要被另外一个作用域所引用就不会被回收

我用几个例子来证明这些。

function a(){
var user = "追梦子";
return user;
}
var b = a();
console.log(b); //追梦子

  按理说我是不能访问函数a里面的变量的,但是我通过全局变量b接收了这个函数a return过后的值,于是最后这段代码就成了下面这样。

function a(){
var user = "追梦子";
return user;
}
var b = "追梦子";
console.log(b);

  好像这并看不出什么代码回收,那么我们看接下来的一段代码。

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

  看到了吧,如果按照正常的做法,那么输出的应该是3次1次对,因为函数体一旦运行那么这个函数体内的代码就会被清空,既然会被清空那么下次运行这段代码的时候num应该还是1,但是这里情况有些不同,我上面说过函数中的局部变量只要被另外一个作用域所引用那么这段代码就不会被销毁。

  上面的代码就像这样

function a(){
var num = 0;
return function(){
num ++;
console.log(num);
};
}
var b = function(){
num ++;
console.log(num);
};
b();
b();
b();

那么被函数a返回的那个匿名函数的作用域由函数a转向了window,由于这个匿名函数被全局变量b引用所以不会被销毁。

function a(){
var num = 0;
return function(){
num ++;
console.log(num);
};
}
var b = {
fn:a()
}
b.fn(); //
b.fn(); //
b.fn(); //

同样可以,因为匿名函数被对象b的属性fn引用,改变了它的作用域,简单来说只要一个函数或者局部变量被改变作用域那么这个函数或者局部变量就不会被销毁。

不知道你们能不能听懂。

最新文章

  1. codeforces 719E E. Sasha and Array(线段树)
  2. 日志logger
  3. Java架构必会几大技术点(转)
  4. jquery如何选择带有多个class的元素
  5. PrintWriter的print和write方法(转)
  6. SQL Server 本地时间和UTC时间的相互转换的代码
  7. DataSnap起源于MIDAS(十几篇博客)
  8. JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)
  9. [置顶] LLVM每日谈之十五 LLVM自带的examples
  10. Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContextAware
  11. (十二)java嵌套类和内部类
  12. 基于python创建一个简单的HTTP-WEB服务器
  13. 初识在Spring Boot中使用JPA
  14. 基于python开发的股市行情看板
  15. python基础之 基本数据类型,str方法和for循环
  16. Python shutil 模块
  17. day10 前向引用
  18. Linux:进程实例信息(/proc)
  19. CorelCAD for Mac(绘图设计软件)破解版安装
  20. NUCLEO-F767ZI评测 NUCLEO-F767ZI入门教程CubeMX

热门文章

  1. Android 学习之异常总结--java.lang.IllegalStateException:Could not execute method of the activity
  2. Eclipse崩溃后无法启动的问题解决
  3. WORD2003电子签名插件(支持手写、签章)
  4. linux 下查找大于100M的文件(转)
  5. .svn批量删除
  6. SQL SERVER 2008中输入汉字乱码的问题
  7. MS SQL SERVER索引优化相关查询
  8. ELK——Elasticsearch 搭建集群经验
  9. Android 初始化Setup Wizard——Provision
  10. 【LeetCode】264. Ugly Number II