Der Lambda-Ausdruck von C # hat ebenfalls Abschlüsse , wird jedoch in den C # -Gemeinschaften oder Büchern selten diskutiert. Ich sehe weit mehr JavaScript-Leute und -Bücher über seine Schließungen als in der C # -Welt. Warum das?
Der Lambda-Ausdruck von C # hat ebenfalls Abschlüsse , wird jedoch in den C # -Gemeinschaften oder Büchern selten diskutiert. Ich sehe weit mehr JavaScript-Leute und -Bücher über seine Schließungen als in der C # -Welt. Warum das?
Antworten:
Weil Javascript keine Funktionen wie Namespaces hat und Sie ziemlich leicht mit allen Arten von globalen Objekten durcheinander kommen können.
Daher ist es wichtig, Code in seiner eigenen Ausführungsumgebung zu isolieren. Dann bist du in Closure genau richtig.
Diese Verwendung von Closure ist in einer Sprache wie C # nicht sinnvoll, in der Namespaces, Klassen usw. vorhanden sind, um Code zu isolieren und nicht alle Elemente in den globalen Bereich einzubeziehen.
Eine sehr verbreitete Praxis für Javascript-Code ist es, wie folgt zu schreiben:
(function(){
// Some code
})();
Wie Sie sehen, handelt es sich um eine anonyme Funktionsdeklaration, auf die die Ausführung sofort folgt. Somit ist es nicht möglich, von außen auf alle in der Funktion definierten Elemente zuzugreifen, und Sie werden den globalen Bereich nicht durcheinander bringen. Der Ausführungskontext dieser Funktion bleibt so lange erhalten, wie Code sie verwendet, wie in diesem Kontext definierte verschachtelte Funktionen, die Sie als Rückruf oder was auch immer übergeben können.
Javascript ist eine ganz andere Sprache als C #. Es ist nicht objektorientiert, es ist prototyporientiert. Dies führt am Ende zu sehr unterschiedlichen Praktiken.
Wie auch immer, Verschlüsse sind gut, also benutze sie auch in C #!
EDIT: Nach einigen Diskussionen über den Chat von stackoverflow denke ich, dass diese Antwort präzise sein muss.
Die Funktion im Beispielcode ist kein Abschluss. Diese Funktion kann jedoch lokale Variablen und verschachtelte Funktionen definieren. Alle verschachtelten Funktionen, die diese lokalen Variablen verwenden, sind Abschlüsse.
Dies ist nützlich, um einige Daten über eine Reihe von Funktionen hinweg gemeinsam zu nutzen, ohne den globalen Umfang zu beeinträchtigen. Dies ist die häufigste Verwendung von Schließung in Javascript.
Closure ist weitaus leistungsfähiger als das bloße Teilen einiger Daten, aber seien wir realistisch, die meisten Programmierer wissen nichts über funktionale Programmierung. In C # hätten Sie für diese Art der Verwendung eine Klasse oder einen Namespace verwendet, aber JS bietet diese Funktionalität nicht.
Mit Closure können Sie weit mehr tun, als nur den globalen Geltungsbereich zu schützen. Dies wird jedoch im JS-Quellcode deutlich.
Wahrscheinlich, weil gängige Implementierungen der Objektorientierung von JavaScript von Closures abhängen. Schauen wir uns ein einfaches Beispiel an:
function counter() {
var value = 0;
this.getValue = function() { return value; }
this.increase = function() { value++; }
}
var myCounter = new counter();
console.log(myCounter.getValue());
myCounter.increase();
console.log(myCounter.getValue());
Die Methoden getValue
und increase
sind tatsächlich Abschlüsse, die die Variable einkapseln value
.
Weil viele der Bibliotheken, die JavaScript "erträglich" machen, sie verwenden.
Schauen Sie sich JQuery , Prototype oder MooTools an , um nur drei beliebte zu nennen. Jede dieser Bibliotheken stellt eine each
Methode für ihre Sammlungen als bevorzugte Methode für die Iteration bereit , die eine Iteratorfunktion verwendet. Diese Funktion ist beim Zugriff auf Werte im äußeren Bereich ein Abschluss:
[1,2,3].each(function(item) {
console.log(item);
});
Und hier hört es nicht auf: Callbacks in Ajax, Event-Handling in Ext.js usw. übernehmen alle Funktionen, und wenn Sie Ihren Code nicht mit 100 Millionen Funktionen aufblähen möchten, die genau einmal aufgerufen werden, sind Closures der richtige Weg.
console.log
Wird in einem äußeren Bereich definiert, so console
ist eine "freie Variable". Und warum ist eigentlich eine for-Schleife, die nichts anderes macht, eine schlechte Übung?
Ich stimme den anderen Antworten zu, dass eine "gute" Codierung mit JavaScript stärker von Schließungen abhängig ist. Darüber hinaus ist es jedoch wahrscheinlich nur eine Frage, wie lange die Funktion in jeder Sprache bereits verfügbar ist. JavaScript hat im Grunde genommen seit den frühesten Implementierungen Schließungen. C # dagegen hat sie erst seit 3.0, das mit Visual Studio 2008 veröffentlicht wurde.
Viele C # -Programmierer, auf die ich stoße, arbeiten noch an 2.0-Projekten. Und selbst wenn sie in 3.0 oder 4.0 arbeiten, verwenden sie häufig immer noch 2.0-Redewendungen. Ich liebe Verschlüsse; Hoffentlich werden sie in C # häufiger verwendet, da sich das Konzept unter C # -Entwicklern verbreitet.
Der Hauptgrund dafür ist, dass C # statisch typisiert ist und Funktionen nur auf eine einzige, vorgegebene Umgebung zugreifen können, was die Nützlichkeit von Closures beeinträchtigt.
In JavaScript hingegen ermöglichen Closures, dass sich Funktionen beim Zugriff als Objekteigenschaft wie Methoden verhalten. Da es sich um erstklassige Objekte handelt, können sie auch in verschiedene Umgebungen eingefügt werden, sodass Subroutinen in verschiedenen Kontexten ausgeführt werden können.
Ein Grund, warum ich etwas über sie lernen musste, war, dass Sie in der Lage sein möchten, den Gültigkeitsbereich der Variablen zu "schließen" oder "einzukapseln", wenn Sie DOM-Elemente (oder irgendetwas wirklich) durchlaufen. Wie in dem hier veröffentlichten Beispiel: /programming/5606059/how-to-create-closure-in-loop-and-store-it-in-variable-for-later-execution