Der Vorteil davon besteht darin, dass innere Funktionen auf die Parameter und Variablen der äußeren Funktion zugreifen können, in der sie definiert sind.
Erstens konstruieren wir ein einfaches Objekt.
var testObj = {
Wert: 10,
add: function(inc){
this.value = (typeof inc === "number") ? inc : 1;
}
};
testObj.add();
testObj.value; // 11
testObj.add(2);
testObj.value; // 13
Es kann nicht garantiert werden, dass der Wert nicht illegal geändert wird wie folgt .
var testObj = (function(){
var value = 10;
return {
add: function(inc){
value = (typeof inc === "number") ? inc : 1;
},
getValue: function (){
Rückgabewert;
testObj.add();
testObj.getValue(); // 11
testObj.add(2);
testObj.getValue(); // 13
Wir können im Allgemeinen eine Funktion aufrufen, um testObj zu initialisieren Hier wird eine Variable definiert, die den Methoden add und getValue immer zur Verfügung steht, aber aufgrund des Umfangs der Funktion für andere Programme unsichtbar ist. Gleichzeitig können wir auch den Schluss ziehen, dass die innere Funktion einen längeren Lebenszyklus hat als ihre äußere Funktion.
Sehen wir uns weiterhin ein Beispiel für einen Konstruktoraufruf an.
MyObj.prototype.getStatus = function(){
return this.status;
};
var obj = new MyObj("javascript");
obj.getStatus(); // "javascript"
Es ist nichts Falsches daran, dies zu schreiben, aber es wird ein bisschen „unnötig“ sein ", warum? Wie wäre es mit der Verwendung einer getStatus-Methode, um auf eine Eigenschaft zuzugreifen, auf die direkt zugegriffen werden kann? Natürlich macht es nur dann Sinn, wenn Status ein Privateigentum ist.
return status;
}
};
};
var myObj = obj("javascript");
myObj.getStatus(); // "javascript"
Wenn wir hier obj aufrufen, gibt es ein neues Objekt zurück, das die getStatus-Methode enthält, a Der Verweis auf das Objekt wird in myObj gespeichert. Auch wenn obj zurückgegeben wurde, genießt die getStatus-Methode weiterhin das Privileg, auf das Statusattribut des obj-Objekts zuzugreifen. Die getStatus-Methode greift nicht auf eine Kopie des Parameters zu, sondern auf den Parameter selbst. Dies ist möglich, weil die Funktion Zugriff auf den Kontext hat, in dem sie erstellt wurde, was als Abschluss bezeichnet wird.