2012-07-16 14 views
8

Ich habe alle anderen (ausgezeichneten) Antworten auf SO durchgesehen (besonders das: How do JavaScript closures work?), aber ich wollte dein Feedback zu meinem Verständnis des Konzepts.Ist dies ein gültiger Anwendungsfall für das Schließen von JavaScript?

Ich verstehe, dass ein Anwendungsfall ist, die Implementierung von privaten Methoden vor öffentlichem Zugriff zu verbergen.

Die andere, die ich denke, wird es als ein Werk Generator:

<script> 

function carFactory(make) { 

    var m = make; 
    return { manufacture: function (model) 

     {console.log("A " + m + " " + model + " has been created");} 

    } 
} 

toyotaFactory = carFactory("toyota"); 
hondaFactory = carFactory("honda"); 

toyotaFactory.manufacture("corolla"); 
toyotaFactory.manufacture("corolla"); 
hondaFactory.manufacture("civic"); 

</script> 

Diese Ausgänge:

A toyota corolla has been create 
A toyota corolla has been created 
A honda civic has been created 

So denken Sie, es ist ein gültiger Anwendungsfall für Verschlüsse (dh die Schaffung mehrere Fabriken mit der gleichen Code-Basis)? Oder kann ich dasselbe mit etwas viel besserem erreichen?

Bitte beachten Sie, dass es weniger um die technische Implementierung von Closures geht, als vielmehr um gültige Anwendungsfälle in der Anwendungsentwicklung.

Danke.

+0

Sieht für mich ok aus. – Almo

+0

Sieht gut aus! Ich sehe nichts falsch daran. – Linuxios

+3

Technisch brauchen Sie nicht 'm' - Sie können' make' direkt verwenden. – josh3736

Antwort

3

Ja, Variablen privat zu halten ist eine gültige Verwendung für eine Schließung. Es ermöglicht Ihnen, privaten Zugriff auf eine Variable zu haben, ohne es zu einem öffentlichen Mitglied zu machen.

Sehen Sie diese Referenz für andere Beispiele: http://www.crockford.com/javascript/private.html

0

Verschlüsse sind extrem leistungsfähig Konstrukt, mit vielen nützlichen Anwendungen. Der, den du benutzt hast, ist eigentlich ein "Hack". Die gebräuchlichste Verwendung für Closures ist, wenn Sie einige Funktionen implementiert haben, die "etwas in der Mitte tun" ... und dass "etwas" zu mehr oder weniger konfiguriert werden kann, was immer Sie wollen ... Zum Beispiel die jQuery ajax-Funktionalität kann etwas "tun", wenn die Anfrage einen Fehler hat, oder wenn es erfolgreich war, usw. Wenn Sie keine Schließungen haben, können Sie nur eine "statisch definierte" Funktion übergeben, was wahrscheinlich erforderlich ist Sammeln Sie den Kontext, der benötigt wird, um zu tun, was Sie von globalen Variablen aus tun möchten, oder Sie müssen die gleiche Signatur für alle Funktionen verwenden, wie in C oder C++ wie function (customData) {} ... Closures erlaubt Sie können zur Laufzeit "dynamisch Funktionen erstellen" und den Kontext, den sie bei ihrer Erstellung hatten, neu definieren, sodass Sie die Module, die etwas "tun" müssen, auf eine wirklich einfache Art und Weise (im Einklang mit dem was) tun können Sie würden in C oder C++ oder ohne Closu tun res, dass es hässlich, fehleranfällig und auch ein Hack ist).

Also, wenn Sie „konfigurieren“ einige benutzerdefinierte Funktionen innerhalb etwas müssen Sie einen Verschluss verwenden werden ...

1

Wenn ich Ihre Frage richtig zu verstehen, Sie sind nicht mit dem Halten der make Eigentum Privat betroffen ? Wenn das der Fall ist, dann ist ein Verschluss nicht wirklich notwendig, und man konnte die gleiche Funktionalität mit einem Prototyp erreichen ...

function carFactory(model){ 
    this.m = make; 
} 

carFactory.prototype.manufacture = function(model){ 
    console.log('A ' + this.m + ' ' + model + ' has been created'); 
} 

Welche Vorteile Leistung (reduzierte Speicher und erhöhte Geschwindigkeit), wie pro this question zugeordnet ist, .

+1

Dies speichert den Modellnamen, behält ihn jedoch nicht privat. Mitgliedsvariablen sind für jeden verfügbar.Der Vorteil der Schließung des OP besteht darin, dass der Modellname wirklich privat ist. – jfriend00

+0

yeah, habe meine Antwort etwas genauer bearbeitet. Dies ist nur eine praktikable Antwort, wenn es nicht notwendig ist, "make" privat zu halten. Wenn es aber ist, dann ist eine Schließung die beste Lösung. – market

+1

Ich dachte, der ganze Punkt des Abschlusses in der Frage des OP sei Privatsphäre. Ich stimme zu, dass, wenn Privatsphäre nicht benötigt wird, die Schließung komplizierter ist (und wahrscheinlich schlechterer Speicherverbrauch) als nötig. Wenn public, ist eine Membervariable die einfachste. – jfriend00

Verwandte Themen