JS 垃圾回收(GC)
C、C++ 等语言,开发人员需要手动跟踪内存使用情况,造成很多问题。
JS 实现了自动垃圾回收机制,执行环境负责管理内存,其垃圾收集器会周期性找到不再使用的变量,释放其内存。
最简单的情况是:函数中的局部变量,在函数执行结束后就没用了,可以释放
// 函数执行结束后,释放其作用域内的变量所占用内存
function fn1 () {
const a = '11'
console.log(a)
const obj = { x: 100}
console.log(obj)
}
fn1()
// 上面代码执行完毕后,fn1 里的 a 和 obj 变量都没用了,JS 引擎会回收,释放其内存
第二种情况是:全局变量,无论是在全局环境下定义的变量还是在函数里赋给window 的变量,因为后续可能还会用到,所以不会被释放
// 函数里的变量赋给 window,函数执行完后变量也不释放
// 注意:这没有问题,这是符合用户预期的,因为开发人员在定义全局变量的时候就是为了一直能用到它
function fn2() {
const obj = { x: 100}
window.obj = obj
}
fn2()
// 上面代码,因为 obj 赋给了 window,所以在 fn2 执行完后,obj 对应内存不会被回收
第三种情况是:闭包,闭包里的数据因为后续可能还会用到,所以函数执行完后不会被释放
// 闭包变量内存不释放
function getDataFns() {
const data = {}
return {
get(key) {
return data[key]
},
set(key, value){
data[key] = value
}
}
}
const { get, set } = getDataFns()
set('x', 100)
get('x')
// 上面这种闭包的情况下,getDataFns 执行完后,data 也不会释放