2016-09-23 22 views
0

ich habe folgende Schließung:Zugriff auf Variablen von IIFE

var Container = (function() { 
    var variable; 
    var changeVariable = function() { 
     variable = 5; 
    }; 
    return { 
     variable: variable, 
     changeVariable: changeVariable 
    }; 
})(); 

Container.changeVariable(); 
console.log(Container.variable); 

Das Ergebnis ist nicht definiert, es sei denn, ich Setvariable wie:

Container.variable = 5

Warum ist das so? Was ist der Unterschied? Wie soll ich das richtig machen?

+0

Sie haben die Variable durch ** Wert ** zurückgegeben, nicht durch Referenz. Die Variable wird innerhalb des IIFE aktualisiert, der zurückgegebene Wert jedoch nicht. – Tushar

Antwort

2

Warum ist das so?

JavaScript wird nach Wert zugewiesen.

variable = 5; weist der Variablen 5 den Wert variable zu.

variable: variable, weist den Wert von variable (zum Zeitpunkt der Code ausgeführt wird) auf die Eigenschaft variable. Es wird kein Verweis auf die Variable variable erstellt. Wenn Sie später den Wert der Variablen variable ändern, ändern Sie nicht den Wert der Eigenschaft variable.

Wie soll ich das richtig machen?

Erstellen Sie ein Objekt. Speichern Sie das Objekt lokal. Manipulieren Sie dieses Objekt. Gebe das Objekt zurück.

Vergiss die Variable variable vollständig zu haben.

var container = (function() { 
 

 
    var self = { 
 
    variable: undefined, 
 
    changeVariable: changeVariable 
 
    }; 
 

 
    function changeVariable() { 
 
    self.variable = 5; 
 
    } 
 

 
    return self; 
 
})(); 
 

 
container.changeVariable(); 
 
console.log(container.variable);

(Außer: Konvention behält Identifikatoren mit Großbuchstaben für Konstruktorfunktionen beginnend ich Container umbenannt habe diese Konvention zu folgen.).

2

einen Getter verwenden:

return { 
    get variable() { return variable; }, 
    changeVariable: changeVariable 
}; 
+1

Keine Erklärung ??? – Tushar

+1

Dump nicht einfach Code ohne zu erklären, wie und warum es funktioniert. – vlaz