Ich bin mir nicht sicher, was Sie hier erreichen wollen, da der von Ihnen bereitgestellte Code nichts wirklich verwendet. Die Variable foo
wird erstellt und zugewiesen, und es wird eine Funktion Thing
zurückgegeben, aber sobald der IIFE ausgeführt wird, gehen alle Referenzen verloren und die Garbage Collection wird ausgeführt.
Wenn ich die Funktion ein wenig nützlicher als ein Beispiel zu machen, wird erzeugen folgende die thing
Funktion und die Variable foo
wird noch existieren, wie es geschlossen ist vorbei - Siehe closures.
function generateThing() {
var foo = '42';
return function thing() {
console.log("thing:", foo)
};
}
var myThing = generateThing();
myThing();
Wenn Sie foo
in der inneren Funktion verweisen nicht, wird die Referenz nicht aufrechterhalten werden, und es wird Müll gesammelt werden. Wenn Sie ein Objektliteral für Ihr Modul verwenden, können Sie den Bereich unter Verwendung von this
einschränken. Im folgenden Beispiel verweist die Funktion generateThing
auf das Feld foo
des Moduls. Während der Ausführung steht dieser Wert im lexikalischen Umfang zur Verfügung. Wenn Sie jedoch eine innere Funktion erstellen, wird der Kontext this
anders sein. Wenn Sie die zurückgegebene Funktion aufrufen, gibt es daher undefined
aus.
Sie können den Kontext von this
mithilfe der Funktion apply
(unter anderem) steuern. Durch Aufruf der Funktion mit myModule
als Kontext können wir auf die Variable foo
verweisen.
(function() {
var myModule = {
foo: 42,
generateThing: function() {
console.log("generateThing", this.foo);
return function() {
console.log("thing:", this.foo);
}
}
}
window.myModule = myModule;
}());
var thing = myModule.generateThing(); // log: generateThing 42
thing(); // log: thing undefined
thing.apply(myModule); // output: thing 42