垃圾回收
JavaScript是应用垃圾回收的语言,浏览器的 Javascript 具备主动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中应用的内存。其原理是:垃圾收集器会定期(周期性)找出那些不在持续应用的变量,而后开释其内存。这个过程不是实时的,因为其开销比拟大并且GC时进行响应其余操作,所以垃圾回收器会依照固定的工夫距离周期性的执行,这不是一个完满的计划,因为某代码块是否还有用属于“不可判定”问题。
function fn1() { var obj = {name: 'hanzichi', age: 10};}function fn2() { var obj = {name:'hanzichi', age: 10}; return obj;}var a = fn1();var b = fn2();
有两种标记清理,标记清理,援用计数(不罕用)
标记清理
它是JavaScript罕用垃圾回收策略,当变量进入上下文,变量会被加上存在于此上下文的标记(标记办法有很多)。当来到上下文时,加上来到上下文标记。随后垃圾回收程序做一次内存清理,销毁标记,回收内存。
援用计数
援用计数不罕用,它的思路是对每个值记录它被援用的次数。一个值,如果被申明变量并给它赋一个援用值,这个援用数是1,如果这个值被赋给另一个变量,援用数加一。如果改值援用的变量被笼罩,援用数减一。援用数为0就能够回收。
function reference(){ let a = {}//a指向对象的援用数加一,为1 let b = a//援用数加一,为2 let c = a//援用数加一,为3 let b = 6{}援用数减一,为4 }
援用计数有一个问题:循环援用·
function probromle(){let obj1 = new Object();let obj2 = new Object();let obj1.x = obj2let obj2.y = obj1
在这里,obj1和obj2相互援用,援用计数都是2,如此,即使函数退出,援用计数仍然不会是0导致无奈回收。
还有一些问题,比方:com对象循环援用