国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

解決js函數閉包內存泄露問題的辦法

2019-11-20 10:42:43
字體:
來源:轉載
供稿:網友

本文通過舉例,由淺入深的講解了解決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()()());

以上就是為大家分享的解決方法,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 常德市| 吉林省| 特克斯县| 泰顺县| 会东县| 梅州市| 河北区| 温泉县| 佛山市| 西藏| 东兰县| 横峰县| 江华| 绥滨县| 四川省| 遂川县| 荆门市| 都江堰市| 凯里市| 杭锦旗| 巴林右旗| 永德县| 赣榆县| 同心县| 宣恩县| 大竹县| 浦江县| 简阳市| 乐山市| 专栏| 长治县| 肇源县| 五寨县| 嵊州市| 体育| 罗甸县| 岳阳市| 泰州市| 林芝县| 襄汾县| 沿河|