解決js函數閉包記憶體泄露問題的辦法,js函數
本文通過舉例,由淺入深的講解瞭解決js函數閉包記憶體泄露問題的辦法,分享給大家供大家參考,具體內容如下
原始代碼:
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()())
最佳化後的代碼:
function Cars(){ this.name = "Benz"; this.color = ["white","black"];}Cars.prototype.sayColor = function(){ var outerColor = this.color; //儲存一個副本到變數中 return function(){ return outerColor; //應用這個副本 }; outColor = null; //釋放記憶體};var instance = new Cars();console.log(instance.sayColor()())
稍微複雜一點的例子:
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()()());
首先,該例子組合使用了建構函式模式和原型模式建立Cars 對象,並用了寄生組合式繼承模式來建立Car 對象並從Cars 對象獲得屬性和方法的繼承;
其次,建立一個名為instance 的Car 對象的執行個體;instance 執行個體包含了sayColor 和sayNumber 兩種方法;
最後,兩種方法中,前者使用了一個閉包,後者使用了兩個閉包,並對其this 進行修改使其能夠訪問到this.color 和this.number。
這裡存在記憶體泄露問題,最佳化後的代碼如下:
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()()());
以上就是為大家分享的解決方案,希望對大家的學習有所協助。
您可能感興趣的文章:
- 權威JavaScript 中的記憶體泄露模式
- JavaScript 匿名函數(anonymous function)與閉包(closure)
- JavaScript閉包 懂不懂由你反正我是懂了
- js bind 函數 使用閉包儲存執行內容
- Javascript 閉包引起的IE記憶體泄露分析
- js記憶體泄露的幾種情況詳細探討
- 關於js記憶體泄露的一個好例子
- 容易造成JavaScript記憶體泄露幾個方面
- 淺談js 閉包引起的記憶體泄露問題