国产探花免费观看_亚洲丰满少妇自慰呻吟_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()()());

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博乐市| 上蔡县| 天峻县| 确山县| 淮滨县| 南部县| 朝阳县| 厦门市| 白沙| 根河市| 改则县| 兴化市| 广河县| 犍为县| 舒城县| 景德镇市| 云阳县| 宝丰县| 鄱阳县| 金乡县| 彰化县| 仙桃市| 公主岭市| 镇沅| 凭祥市| 留坝县| 翁源县| 内乡县| 盘山县| 静宁县| 石棉县| 泾阳县| 钟山县| 通江县| 灌阳县| 上高县| 乌鲁木齐县| 光泽县| 峨眉山市| 珲春市| 伊春市|