js循环引⽤的解析和解决⽅法
  JavaScript中有两种垃圾回收策略,标记清除和引⽤计数。
⼀、引⽤计数
  引⽤计数的含义是跟踪记录每个值被引⽤的次数。当声明了⼀个变量并将⼀个引⽤类型值赋给该变量时,则这个值的引⽤次数就是1。如果同⼀个值⼜被赋给另⼀个变量,则该值的引⽤次数加1。相反,如果包含对这个值引⽤的变量⼜取得了另外⼀个值,则这个值的引⽤次数减1。当这个值的引⽤次数变成0 时,则说明没有办法再访问这个值了,因⽽就可以将其占⽤的内存空间回收回来。这样,当垃圾收集器下次再运⾏时,它就会释放那些引⽤次数为零的值所占⽤的内存。
⼆、循环引⽤
2.1 js对象之间的循环引⽤
  但引⽤计数有⼀个很严重的问题,循环引⽤。循环引⽤指的是对象A 中包含⼀个指向对象B的指针,⽽对象B中也包含⼀个指向对象A的引⽤。⽐如下⾯这个例⼦:
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
  当函数执⾏完毕后,objectA和objectB还将继续存在,因为它们的引⽤次数永远不会是0。假如这个函数被重复多次调⽤,就会导致⼤量内存得不到回收。
2.2 js对象和COM对象的循环引⽤
  我们知道,IE中有⼀部分对象并不是原⽣JavaScript对象。例如,其BOM和DOM中的对象就是使⽤C++以COM(Component Object Model,组件对象模型)对象的形式实现的,⽽COM对象的垃圾收集机制采⽤的就是引⽤计数策略。因此,即使IE的JavaScript引擎是使⽤标记清除策略来实现的,但JavaScript访问的COM对象依然是基于引⽤计数策略的。换句话说,只要在IE中涉及COM对象,就会存在循环引⽤的问题。
var element = ElementById("some_element");
var myObject = new Object();
myObject.element = element;
原生js和js的区别element.someObject = myObject;
  这个例⼦在⼀个DOM元素(element)与⼀个原⽣JavaScript对象(myObject)之间创建了循环引⽤。其中,变量myObject有⼀个名为element的属性指向element对象;⽽变量element也有⼀个属性名叫someObject回指myObject。由于存在这个循环引⽤,即使将例⼦中的DOM 从页⾯中移除,它也永远不会被回收。
  为了避免类似这样的循环引⽤问题,最好是在不使⽤它们的时候⼿⼯断开原⽣JavaScript对象与DOM元素之间的连接。例如,可以使⽤下⾯的代码消除前⾯例⼦创建的循环引⽤:
myObject.element = null;
element.someObject = null;
三、循环引⽤的解决