Bagaimana untuk menyelesaikan masalah kebocoran memori kemahiran closure_javascript fungsi js

WBOY
Lepaskan: 2016-05-16 15:18:23
asal
1109 orang telah melayarinya

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()())
Salin selepas log masuk

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

Salin selepas log masuk

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

Salin selepas log masuk

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

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!