1. 垃圾回收机制的原理

1.找出不再使用的变量
2.释放其占用的内厝
3.垃圾回收是有固定的时间间隔运行
(垃圾回收机制是对内存当中存储的值进行处理)
—————————-分割线——————————-
函数内部的值在函数执行完毕以后就不存在了,例如

  1. function test1(){
  2. var a = 1;
  3. function test2(){
  4. a++;
  5. console.log(a);
  6. }
  7. test2();
  8. }
  9. test1();//2
  10. test1();//2

闭包是一种特殊的情况

  1. function test(){
  2. var a = 1;
  3. return function(){
  4. a++;
  5. console.log(a);
  6. }
  7. }
  8. var test1 = test();
  9. test1();//2
  10. test1();//3
  11. test1();//4
  12. test1 = null;//解除引用
  13. test1();//Uncaught TypeError: test1 is not a function

2. 垃圾回收的方式

1. 标记清除 mark and sweep

  1. function test(){
  2. var a = 0; //被标记进入环境
  3. }
  4. test(); //a 离开环境

垃圾回收是排除掉AO环境内的和闭包的变量,然后清除掉离开环境的变量,垃圾回收机制在一个周期的时候,会完成内存清除,销毁带标记的值,并回收所占用的内存空间。

不同浏览器的标记方式可能不同,策略可能不同,垃圾回收的时间间隔也可能不同,但都是大同小异的。

2. 引用计数 reference counting

就是对引用值进行计数来进行垃圾回收(低版本的浏览器会使用,例如IE低版本)。
机制,例:

  1. function test(){
  2. var a = new Object;// a = 1,引用次数默认等于1
  3. var b = new Object;// b = 1
  4. var c = a;//a++ = 2
  5. var c = b;//a-- = 1
  6. //特殊情况,循环引用
  7. a.prop = b;// b = 2//如果不解除这俩的引用,将永远会是2,则没办法进行垃圾回收,执行该函数次数越多,则引用次数会越来越大
  8. b.prop = a;// a = 2
  9. //低版本的IE,可以解除引用
  10. a = null;
  11. b = null;
  12. }