本文通過舉例,由淺入深的講解了解決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()()());以上就是為大家分享的解決方法,希望對大家的學習有所幫助。
新聞熱點
疑難解答