JavaScript的垃圾回收

简单的来说一下在别人问你这个问题的时候怎么来回答它

前端新人,如有错误求大佬指出~求教💝

情景复现

大佬提问:“你知道垃圾回收是什么吗?”

我的回答:“(

        因为js的内存是自动分配和回收的,内存在不使用的时候会被垃圾回收器自动进行回收,从而防止内存泄露,内存泄露就是指内存无法回收。这就是js的垃圾回收。

        内存是临时存储变量等数据的位置,内存也是有生命周期的,从内存创建分配,申请变量,对象,函数等。到内存的使用,对内存进行读写,也就是使用变量或函数对象等。以及最后的内存销毁,变量,函数,对象等不再使用,即被垃圾回收自动回收掉。

        它的核心算法就是判断内存是否不再使用,如果是则回收,现在呢,有两种方法可以实现判断。

         第一种就是以前 ie 采用的引用计数,它会计算当前内存被引用的次数,被引用一次计数就+1,不被引用一次计数就-1,当计数为0,该内存就会释放回收,它的优势是简单有效,但是也有一个问题,就是循环引用会导致内存泄露。

        现在浏览器采用的是标记清除,标记就是通过根节点,也就是全局,标记所有从根节点开始的能够访问到的对象。未被标记的对象就是未被全局引用的垃圾对象,最终清除所有未被标记的对象。

)”

引用计数:

var a = { name: '张三', age: '李四' } // a地址 => {name: '张三', age: '李四'} 被引用次数 1
var b = a // b地址 => {name: '张三', age: '李四'} 被引用次数 2
var c = a // c地址 => {name: '张三', age: '李四'} 被引用次数 3

a = 1
b = null
c = true

标记清除:

function fn() {
  var a = {}
  var b = {}
  a.a1 = b
  b.b1 = a
}

fn()

因为 fn 函数内部的数据在全局无法访问到,所以 fn 执行后,函数内部的数据自动被清除

function fn() {
  var a = {}
  var b = {}
  a.a1 = b
  b.b1 = a
  return a
}

var obj = fn()

fn 函数调用后,全局在引用着 fn 函数内部 a 的数据,a 又用着 b 的数据,所以 fn 函数内部的数据全都不会清除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值