js中的垃圾回收机制是通过自动内存管理实现内存分配和闲置资源回收;
基本思路:确定哪个变量不会再使用,然后释放它占用的内存;
垃圾回收程序必须跟踪记录哪个变量还会使用,以及哪个变量不在使用,以便回收内存;
标记策略:标记清理(常用)和引用计数;
标记清理:
function test1(){
// 垃圾回收机制使用的是标记清除的方法
var a = 1;
// 此时的标记进入环境
}
test1();
// 执行完之后,变量a被标记为离开环境
引用计数:
// 根据记录每一个引用值被使用的次数,来做清理,如果是0就清除,不是就不会被清理
// 在老版的ie浏览器中就是使用这种引用计数的垃圾回收机制
function test(){
var a = new Object(); // 引用值赋给变量的时候他的引用值次数默认为1
var b = new Object();
a.prop = b; // 此时的b的引用次数是2
b.prop = a; // a的引用次数也是2
// 这里构成了一种循环引用的方式
// 在低版本的ie中当你不想在使用这个值的时候,需要手动解除引用
a = null;
b = null;
}
垃圾回收机制的例子:
function test1(){
var a = 1;
function test2(){
a++;
console.log(a);
}
test2(); // 在这里调用完test2之后变量a就不存在了
}
test1(); // 2
test1(); // 2 之后每次调用test1时输出的只会是2
有一个特例就是“闭包”特性:
function test1(){
var a = 1;
return function(){
a++;
console.log(a);
}
}
var test = test1();
test(); // 2
test(); // 3
test(); // 4
test(); // 5
闭包的三个特性:
1、函数嵌套函数
2、函数内部可以引用函数外部的参数和变量
3、参数和变量不会被垃圾回收机制回收