js的闭包内存泄露
js闭包内存泄漏案例
// js内存泄露不会出现安全问题.但是会卡死
function createFnArray() {
// 1kb = 1024byte 4byte * 1024 = 4kb 4kb = 1024byte * 4
// 1024 * 1024 * 4byte = 4m
// 占据的空间是4m x 100(个数) + 其他内存 = 400m+
// 正常来说 number 占据8byte,但js引擎对特别小的数字类型(2的32次方)进行优化,使其占4byte
var arr = new Array(1024*1024).fill(1) // 1个整数占据4个字节
return function(){
console.log(arr.length);
}
}
// var arrayFn = createFnArray()
// arrayFn = null
// 100 * 100 = 10000 = 10s
var arrayFns = []
for (var i = 0; i < 100; i++) {
setTimeout(() => {
arrayFns.push(createFnArray())
}, i * 100);
}
// arrayFns = null
setTimeout(() => {
for (var i = 0; i < 50; i++) {
setTimeout(() => {
arrayFns.pop()
}, 100 * i);
}
}, 10000);
js闭包的自由变量如何销毁
function foo(){
var name = 'Fhup'
var age = 18 // js引擎会删除掉这个自由变量(优化)
function bar(){
debugger
// 右边的 Closure (foo) 表示: bar访问foo的自由变量. 只包含name值,age被销毁
console.log(name);
}
return bar
}
var fn = foo()
fn()