Heim  >  Artikel  >  Web-Frontend  >  So lösen Sie das Speicherleckproblem der js-Funktionsschließung_javascript-Fähigkeiten

So lösen Sie das Speicherleckproblem der js-Funktionsschließung_javascript-Fähigkeiten

WBOY
WBOYOriginal
2016-05-16 15:18:231156Durchsuche

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()()());
Das Obige ist die Lösung, die allen zur Verfügung gestellt wird. Ich hoffe, dass sie für das Lernen aller hilfreich sein wird.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn