闭包,闭包的内存泄漏,如果解决

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的内存,让这个变量被垃圾回收机制给回收走

你可能感兴趣的:(javascript,开发语言,ecmascript)