1.闭包的形成一般是函数内部引用到了外部的变量,此时这个引用一直存在导致不会被垃圾回收机制给回收走
2.闭包的内存泄漏,如果解决
一.在定时器不被使用的时候及时清除定时器
// 没有及时清理的计时器或回调函数,也会导致内存泄漏,如下如果我们不把定时器不使用的时候清除掉就会一直存在,这样就好导致内存泄漏,
因为count这个变量一直被定时器所引用,我们如果不清楚定时器,此时count就不会被垃圾回收机制给回收走,这样就导致了内存泄漏;
const count = '123123'
var intervalId = setInterval(function () {
console.log('count',count)
}, 1000);
//
// clearInterval(intervalId);
二.在变量不被使用的时候及时的赋值为null;
function fn1(){
var arr=new Array(1000);
return function fn2(){
console.log(arr.length)
}
}
var f=fn1();
f();
f();
f();//不释放 内存泄露 占用空间
//此时f变量已经用完了后面不在被使用
f=null;//释放
// 内存泄漏解决方案,手动的清除引用,赋值为null
function Na(params) {
this.color = [12]
this.name = 'jacky'
}
/*
此时函数,函数father内部引用到的this,是Na函数new Na的实例对象,并且在在son函数中被使用,所以我们如果定义一个变量去接收new Na
例如let instance = new Na();因为这个实例对象被引用所以let instance这个变量就不会被垃圾回收机制给回收走;
*/
Na.prototype.say = function father() {
let self = this;
return function son() {
console.log('self.color',self.color)
return self.color
}
}
// //此时每次定义的块级作用域变量instance,都不会被收走,并且都引用了new Na(),这样长此以往执行定时器就会导致内存泄漏,我们要希望垃圾回收机制把作用域变量instance回收就要手动的在使用完作用域变量instance的时候给作用域变量instance赋值为null。
let instance = new Na();
console.log('instance', instance);
instance.say()//我对say方法使用完毕了,并且后续都不会在使用instance这个实例对象的引用;
//此时我们通过赋值为null去释放内存
instance = null;//释放instance的内存,让这个变量被垃圾回收机制给回收走