解決js函數閉包記憶體泄露問題的辦法,js函數

來源:互聯網
上載者:User

解決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 閉包引起的記憶體泄露問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.