一、内存释放(垃圾回收)
1、主动释放
JavaScript不需要手动地释放内存,它使用一种自动垃圾回收机制(garbage collection)。当一个对象无用的时候,即程序中无变量引用这个对象时,就会从内存中释放掉这个变量。
var
s
=
[
1
,
2
,3];
console.log(s)
// end 程序执行到这,发现s 不再使用,释放
你也可以主动释放
s
=
null
;
2、最近使用优先原则,有A, B ,C D, 变量, 执行一次则被调用的变量标记 + 1, 没有用到的减掉1 。当计数为零,或者需要新的内存块(内存不够了)则释放 计数最少者。呃,大意就是这样,底层执行还有很复杂,资源锁啦,依赖啦,有意可以自己深究。
二、内存维持
1、循环引用
三个对象 A 、B 、C
A=>B=>C :A的某一属性引用着B,同样C也被B的属性引用着。如果将A清除,那么B、C也被释放。
A=>B=>C=>B :这里增加了C的某一属性引用B对象,如果这是清除A,那么B、C不会被释放,因为B和C之间产生了循环引用。
2、循环引用和闭包
function
outer(arg){
var num = 0
function inner(){
console.log(num)
function inner(){
console.log(num)
num++
}
return inner
}
}
return inner
}
var fun = outer()
fun() // 0
fun() // 1
这是一种内部的引用。当调用一次outer时,就会在其内部创建num变量和inner对象,inner使用了num. 这样即使执行完,因为引用没有释放,内存仍然会存在。好处是可以保持变量,坏处是闭包多了,内存被占满(也叫内存泄露)。
小结:无用变量手动释放,巧妙使用闭包可以达到缓存的目的,闭包是个双刃剑(慎用)