解決js函數(shù)閉包內(nèi)存泄露問題的辦法
本文通過舉例,由淺入深的講解了解決js函數(shù)閉包內(nèi)存泄露問題的辦法,分享給大家供大家參考,具體內(nèi)容如下
原始代碼:
function Cars(){
this.name = "Benz";
this.color = ["white","black"];
}
Cars.prototype.sayColor = function(){
var outer = this;
return function(){
return outer.color
};
};
var instance = new Cars();
console.log(instance.sayColor()())
優(yōu)化后的代碼:
function Cars(){
this.name = "Benz";
this.color = ["white","black"];
}
Cars.prototype.sayColor = function(){
var outerColor = this.color; //保存一個副本到變量中
return function(){
return outerColor; //應(yīng)用這個副本
};
outColor = null; //釋放內(nèi)存
};
var instance = new Cars();
console.log(instance.sayColor()())
稍微復(fù)雜一點的例子:
function inheritPrototype(subType,superType){
var prototype = Object(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
}
function Cars(){
this.name = "Benz";
this.color = ["white","black"];
}
Cars.prototype.sayColor = function(){
var outer = this;
return function(){
return outer.color;
};
};
function Car(){
Cars.call(this);
this.number = [321,32];
}
inheritPrototype(Car,Cars);
Car.prototype.sayNumber = function(){
var outer = this;
return function(){
return function(){
return outer.number[outer.number.length - 1];
}
};
};
var instance = new Car();
console.log(instance.sayNumber()()());
首先,該例子組合使用了構(gòu)造函數(shù)模式和原型模式創(chuàng)建Cars 對象,并用了寄生組合式繼承模式來創(chuàng)建Car 對象并從Cars 對象獲得屬性和方法的繼承;
其次,建立一個名為instance 的Car 對象的實例;instance 實例包含了sayColor 和sayNumber 兩種方法;
最后,兩種方法中,前者使用了一個閉包,后者使用了兩個閉包,并對其this 進行修改使其能夠訪問到this.color 和this.number。
這里存在內(nèi)存泄露問題,優(yōu)化后的代碼如下:
function inheritPrototype(subType,superType){
var prototype = Object(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
}
function Cars(){
this.name = "Benz";
this.color = ["white","black"];
}
Cars.prototype.sayColor = function(){
var outerColor = this.color; //這里
return function(){
return outerColor; //這里
};
this = null; //這里
};
function Car(){
Cars.call(this);
this.number = [321,32];
}
inheritPrototype(Car,Cars);
Car.prototype.sayNumber = function(){
var outerNumber = this.number; //這里
return function(){
return function(){
return outerNumber[outerNumber.length - 1]; //這里
}
};
this = null; //這里
};
var instance = new Car();
console.log(instance.sayNumber()()());
以上就是為大家分享的解決方法,希望對大家的學習有所幫助。
相關(guān)文章
js判斷復(fù)選框是否選中及選中個數(shù)的實現(xiàn)代碼
下面小編就為大家?guī)硪黄猨s判斷復(fù)選框是否選中及選中個數(shù)的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
Javascript中Cookie的獲取和保存應(yīng)用案例
這篇文章主要給大家介紹了關(guān)于Javascript中Cookie的獲取和保存應(yīng)用的相關(guān)資料,Cookie是直接存儲在瀏覽器中的一小串數(shù)據(jù),文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-09-09
javascript的alert box在java中如何顯示多行
這篇文章主要介紹了javascript的alert box在java中如何顯示多行,需要的朋友可以參考下2014-05-05
微信小程序使用GoEasy實現(xiàn)websocket實時通訊
這篇文章主要介紹了微信小程序使用GoEasy實現(xiàn)websocket實時通訊的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05

