In diesem Artikel wird anhand von Beispielen erläutert, wie Sie das Problem des Speicherverlusts beim Schließen von js-Funktionen lösen können, und er wird als Referenz für alle freigegeben. Der spezifische Inhalt lautet wie folgt:
Originalcode:
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()())
Optimierter Code:
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()())
Ein etwas komplizierteres Beispiel:
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()()());
In diesem Beispiel wird zunächst eine Kombination aus Konstruktormuster und Prototypmuster verwendet, um das Cars-Objekt zu erstellen, und das parasitäre kombinierte Vererbungsmuster wird verwendet, um das Car-Objekt zu erstellen und die Vererbung von Eigenschaften und Methoden vom Cars-Objekt zu erhalten ;
Zweitens erstellen Sie eine Instanz des Car-Objekts mit dem Namen „instance“. Die Instanzinstanz enthält zwei Methoden: sayColor und sayNumber;
Schließlich verwendet die erstere der beiden Methoden einen Abschluss und die letztere zwei Abschlüsse und ändert dessen This, sodass auf this.color und this.number zugegriffen werden kann.Hier liegt ein Speicherleckproblem vor. Der optimierte Code lautet wie folgt:
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()()());