Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimana untuk menyelesaikan masalah kebocoran memori kemahiran closure_javascript fungsi js

Bagaimana untuk menyelesaikan masalah kebocoran memori kemahiran closure_javascript fungsi js

WBOY
WBOYasal
2016-05-16 15:18:231156semak imbas

Artikel ini menerangkan cara menyelesaikan masalah kebocoran memori penutupan fungsi js melalui contoh, dari cetek kepada mendalam, dan berkongsinya dengan semua orang untuk rujukan anda. Kandungan khusus adalah seperti berikut

Kod asal:

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()())

Kod dioptimumkan:

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()())

Contoh yang lebih rumit:

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()()());

Pertama sekali, contoh ini menggunakan gabungan corak pembina dan corak prototaip untuk mencipta objek Cars, dan menggunakan corak warisan gabungan parasit untuk mencipta objek Car dan mendapatkan warisan sifat dan kaedah daripada objek Cars ;

Kedua, buat contoh objek Kereta bernama contoh; contoh contoh mengandungi dua kaedah: sayColor dan sayNumber;

Akhir sekali, daripada dua kaedah, yang pertama menggunakan satu penutupan, dan yang terakhir menggunakan dua penutupan, dan mengubah suai ini supaya ia boleh mengakses this.color dan this.number.

Terdapat masalah kebocoran memori di sini. Kod yang dioptimumkan adalah seperti berikut:

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()()());
Perkara di atas adalah penyelesaian yang dikongsikan kepada semua.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn