javaScript内存泄露——闭包
var testA = function() {
var largeArray = new Array(1000000000);
return function() {
return largeArray;
}
};
testA();
var testB = function() {
var newObj = document.createElement(“div”);
newObj.onclick = function(){};
}
var testC = function(){};
testC.prototype = {
init:function(){
this._interval = null;
this.start();
},
start: function(){
var self = this;
this._interval = setInterval(function(){
self.onInterval();
}, 100);
},
destroy: function(){
if(this._interval !== null){
clearInterval(this._interval);
}
},
onInterval: function(){
console.log("Interval");
}
};
解决方案:
- testA: 如果闭包不销毁,堆上分配的largeArray也不会被销毁
- testB: 在函数结尾处加上 newObj = null; 让垃圾回收器知道这是一个可销毁的对象
- testC: 在调用testC的代码中显式调用 destroy()方法
经验:
- 使用闭包可以,但是闭包的实现不要太过复杂,我一直认为代码的可读性是非常重要的。一般来说我们可以使用闭包来实现python装饰器的作用,不要随意使用闭包。
- 闭包中的临时对象,需要设置obj=null,将内存释放。