一、什么是垃圾
一般来说,没有被引用的对象就是垃圾,为了减少内存被无用的变量占用造成内存的浪费,所以需要对垃圾进行回收
二、回收的方法
1.标记清除
- 清除维度:其作用域是否在执行环境
- 不同执行环境清除原则:全局作用域是在当前窗口在执行态的时候就不会被清除,但是局部环境是在其执行环境被销毁的时候就会被标记清除
- 举例解释
let obj1 = {
prop: 'obj1'
}
function f1() {
let obj2 = {
prop: 'obj2'
}
return obj2
}
f1()
对象obj1是全局环境中的声明,obj2是局部环境f1中的声明,当f1()执行之后,obj2就会被释放,但是全局作用域中的obj1不会
- 图示
2.引用计数清除
- 清除维度:对象被引用的次数
- 清除规则:当一个对象被赋值null的时候会被清除,当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来
- 举个栗子:下面的例子会比较容易理解
let obj = {
prop:'obj'
} // 该对象的{ prop: 'obj }的引用次数为1
let obj1 = obj // 该对象的{ prop: 'obj }的引用次数为2
obj1 = {
prop: 'obj1'
}// 该对象的{ prop: 'obj }的引用次数-1,为1
obj = null // 该对象的{ prop: 'obj }的引用次数为0,会被清除