06 闭包机制及浏览器垃圾回收处理
函数执行,产生一个私有的上下文,然后进栈
- 当函数执行完,—般情况下,当前形成的上下文都会被出栈释放掉「优化栈内存」:上下文被释放,之前存储的私有变量等也会被释放
- 但是如果当前上下文中的某些东西「一般都是堆内存」,被当前上下文以外的事物所占用,则当前上下文不能出栈释放!!:之前声明的私有变量也都被存储起来了!!
市面上会把不被释放的上下文称为“闭包”
闭包是一种机制,函数执行产生的私有上下文,一方面可以保护里面的私 有变量不被污染,另一方面如果不被释放,私有的变量及相关信息也都会 保存起来,我们把这种“保护”+“保存”的机制,称之为「闭包」!!
堆内存释放向题:如果当前的堆被占用了 「地址被引用」则不能释放,如果不被引用,浏览器会在空闲的时候释放他 GC:沟览器的垃圾「肉存」回收机制
- 引用计数 「被占/用一次计数累加 1,当取消运用再减去 1,当减到零的时候,会把其样放掉」
- 引用检测 标记消除「被占用后做一个标记,当移除号 1 用,取消标记,在测发器空闲的时候,会把所有未被标记的内存回收」
代码案例分析一
js
let x = 5
function fn(x) {
return function (y) {
console.log(y + ++x)
}
}
let f = fn(6)
f(7)
fn(8)(9)
f(10)
console.log(x)代码案例分析二
js
let a = 0,
b = 0
function A(a) {
A = function (b) {
alert(a + b++)
}
alert(a++)
}
A(1)
A(2)