经过连接过来的朋友知道闭包存在内存不清除问题,也就是局部变量原本要自动清除的,如今不清除了,那么这个清除是怎么个清除法?算法
手动清除法:适用于闭包不用了的状况下windows
function outer() { var a = 1; return function inner() { a = a + 1; console.log(a) } } // fn和inner函数连在一块儿,不能自动清理a var fn = outer(); // 不用闭包了,跟inner断开联系 fn = null ;
标记-清除法(浏览器默认,有内存储存不连续缺点):说的简单点,不一样浏览器都是固定时间清理一次,清理那些再也不须要的变量,只不过不一样浏览器的时间不一样而已,都说了是标记-清除,首先要标记。【CG算法】(共轭梯度)(迭代)浏览器
标记:从windows全局对象开始往下找,找到了作个标记,作什么标记不重要(红宝书),没找到的也就是没标记的都要清除。也就是为何把outer()给全局fn就不用清除a了呢,由于赋值给fn,windows下找到了fn,fn又找到了a因此清除不了。闭包
清除:垃圾清理器清理就好函数
引用计数法(循环引用没法清除):记录引用次数,0次就能够清除了,循环引用是致命的,因此浏览器都抛弃了引用计数法spa
var obj1 = { fn: function(a) { console.log(a); } }; var obj2 = { fn: function(b){ console.log(b); } }; // obj1引用了obj2,obj2引用了obj1,引用计数法没法清除 obj1.fn(obj2) obj2.fn(obj1)
最后说一下内存泄露(之后没用又清除不了)的几种常见状况:全局变量(没法被回收机制清除,不知道之后会不会还会用),闭包(感受本质上仍是全局变量不能回收引发的),(DOM清除下)事件未清理code