Maison >interface Web >js tutoriel >Comment résoudre le problème de fuite de mémoire des compétences de fermeture_javascript de la fonction js
Cet article explique comment résoudre le problème de fuite de mémoire de fermeture de fonction js à travers des exemples, du superficiel au profond, et le partage avec tout le monde pour votre référence. Le contenu spécifique est le suivant
.Code d'origine :
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()())
Code optimisé :
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()())
Un exemple un peu plus compliqué :
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()()());
Tout d'abord, cet exemple utilise une combinaison du modèle constructeur et du modèle prototype pour créer l'objet Cars, et utilise le modèle d'héritage combiné parasite pour créer l'objet Car et obtenir l'héritage des propriétés et des méthodes de l'objet Cars. ;
Deuxièmement, créez une instance de l'objet Car nommée instance ; l'instance d'instance contient deux méthodes : sayColor et sayNumber ;
Enfin, des deux méthodes, la première utilise une fermeture, et la seconde utilise deux fermetures, et modifie son this pour pouvoir accéder à this.color et this.number.Il y a un problème de fuite de mémoire ici. Le code optimisé est le suivant :
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()()());