简单的来说一下在别人问你这个问题的时候怎么来回答它
前端新人,如有错误求大佬指出~求教💝
情景复现
大佬提问:“你知道垃圾回收是什么吗?”
我的回答:“(
因为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 函数内部的数据全都不会清除