js中的垃圾回收

53 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

js中的垃圾

对前端开发来说js中的内存管理是自动的,每当我们去创建一个对象,数组和函数的时候会自动分配内存空间,代码在执行的过程中如果通过引用无法找到对象的时候,这些对象就被看作是垃圾,又或者对象已经存在,但是由于代码不合适的语法或结构性的错误找不到对象,这种对象也被称为垃圾

  • js中的内存管理是自动的
  • 对象不再被引用时是垃圾
  • 对象不能从根上访问到时是垃圾

然后javascript的引擎就会将这些垃圾占据的内存空间回收

js中的可达对象

可达对象指的是可以访问到的对象,可达的标准就是从根出发能否被找到,在js里根可以认为是全局变量对象(全局执行上下文)

js中的引用和可达

在下面代码中,定义一个变量obj指向一个对象,相当于这个对象空间被obj引用了,在全局执行上下文下,这个obj可以从根上被找到,这个obj是一个可达的对象

再定义一个obj1变量,让它等于obj,相当于对象又一次被引用了,然后将obj赋值为null,这个对象是有2个变量引用的,虽然obj和对象的引用被断掉了但是obj1还在引用,这个对象依然是一个可达对象

let obj = {name:'你好'}
let obj1 = obj
obj = null

下面的代码来演示可达操作,定义一个函数objGroup,设置两个形参obj1和obj2,在函数里obj1通过一个属性指向obj2,而obj2也通过一个属性指向obj1,最后return一个对象,o1通过obj1返回,o2通过obj2返回,然后在调用这个函数

function objGroup(obj1,obj2) {
    obj1.next=obj2
    obj2.prev=obj1
    return{
        o1:obj1,
        o2:obj2
    }
}
let obj=objGroup({name:'obj1'},{name:'obj2'})
console.log(obj);

从全局的出发找到一个可达的对象obj,它是通过一个函数调用之后指向的内存空间,在o1和o2里面又通过相应的属性指向obj1的空间和obj2的空间,对于obj1和obj2他们两个又通过next和prev互相引用,所以代码里面所出现的对象都可以从根上查找

图片.png

如果通过delete把obj身上的o1的引用和obj2对obj1的引用删掉,就找不到obj1的对象空间了,那么obj1会被认为是垃圾,js引擎就会将obj1回收

图片.png