JavaScripot Funktionen

Die Behandlung von Funktionen wie Objekte

  

Problem Sie wollen sich die Tatsache zunutze, dass die Funktionen Objekte nehmen (zur Erinnerung, alles ist ein Objekt in JavaScript). Theory Viele Leute denken, dass eine Funktion in JavaScript einige Keyword verwendet wird. Eine Funktion ist auch ein Objekt, das bearbeitet werden kann. Wissend, dass eine Funktion ein Objekt ist, macht es sehr interessant, aus der Perspektive der Schreiben von JavaScript-Code, weil der Code die Funktion kann wie der andere ein anderes Objekt zu behandeln. Das heißt, Sie können Funktionen, Variablen zuweisen, ist die Klasse Eigenschaften, und was haben Sie. Die Lösung Eine Möglichkeit der Verwendung dieser Fähigkeit, die Fabrik-Muster, um eine Funktion Objekt zurückzugeben umzusetzen. Zum Beispiel, in Ajax Sie haben zwei Möglichkeiten zum Instanziieren des XMLHttpRequest-Objekt, und die Methode verwendet wird, hängt vom Browser ab.

Das Factory Pattern wird verwendet, um die Schnittstelle von der Implementierung zu trennen. In der Regel, dass die Implementierung einer Schnittstelle bedeutet, sondern weil JavaScript ist eine dynamische Sprache ist, gibt es keine wirkliche Vorstellung von einer Schnittstelle. In einer dynamischen Sprache, eine Schnittstelle ist nicht notwendig, weil Sie eine Methode kann direkt, ohne dass eine bestimmte Art nennen. Im Falle des XMLHttpRequest-Objekt-Instanziierung, gibt die Fabrik-Muster ein Funktions-Referenz, die verwendet werden, um zu instanziieren XMLHttpRequest mit der entsprechenden Technik kann . In JavaScript ist eine Funktion, ein Objekt, das einer Variablen zugewiesen werden kann. Ein Weg zur Umsetzung der Fabrik, die instanziiert XMLHttpRequest Funktion Zuordnungen zu verwenden. Die vollständige Umsetzung ist wie folgt.

 Quelle: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html Funktion InstantiateIEXMLHttpRequest () (return new ActiveXObject ( "Microsoft.XMLHTTP");) function InstantiateOthersXMLHttpRequest () (return new XMLHttpRequest ();) function FactoryXMLHttpRequest () (if (window.ActiveXObject XMLHttpRequest) (return InstantiateOthersXMLHttpRequest;) else if (window.ActiveXObject) (return InstantiateIEXMLHttpRequest;) throw new Error ( "konnte nicht initialisiert werden XMLHttpRequest");)

Im obigen Beispiel wird die Funktion FactoryXMLHttpRequest die Umsetzung der Fabrik-Muster. Innerhalb der Funktion, wenn die Umsetzung sind zwei Aussagen, die überprüfen, welche Browser läuft. Je nach Browser wird die return-Anweisung einen Verweis zurück zur InstantiateIEXMLHttpRequest entweder die Funktion oder die InstantiateOthersXMLHttpRequest Funktion. In beiden Fällen ist die Fundstelle wieder eine Funktion, die das XMLHttpRequest-Objekt instanziiert werden. Der Code, der FactoryXMLHttpRequest Methode verwendet folgt.

 Quelle: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html factory_function: function () (var InstantiateXMLHttpRequest = FactoryXMLHttpRequest (); var xmlhttp = InstantiateXMLHttpRequest (); assertNotNull (xmlhttp);)

Beachten Sie in diesem Beispiel, wie die InstantiateXMLHttpRequest Variable kann als eine Funktion behandelt werden. Zu illustrativen Zwecken verwendet das InstantiateXMLHttpRequest Variable eine Mischung aus Groß-und Kleinbuchstaben zu veranschaulichen, dass, wenn die Variable aufgerufen wird, wie ein Funktionsaufruf aussieht. Basierend auf der Kennung und dem Kontext, in dem die Variable als eine Funktion benutzt, würden Sie nicht wissen, dass die Variable nicht eine Funktion.

Dies ist ein sehr wichtiger Punkt, weil es zeigt, dass eine Funktion nur ein weiteres Objekt. FactoryXMLHttpRequest codiert ist mit einem traditionellen Ansatz: Der Code wird erklärt, eine Funktion, die aufgerufen wird, wenn eine Instanz einer Funktion zurückzugeben. Das Verhalten des Codes ist entschlossen, nachdem der Code analysiert worden und initialisiert. Mit JavaScript ist dies nicht notwendig, weil Sie die Funktionen, wenn der Code wird analysiert, um es zu optimieren kann zu initialisieren. Zum Beispiel könnten Sie den Code neu schreiben FactoryXMLHttpRequest wie folgt.

 Quelle: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html 

 Quelle: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html Funktion FunctionFunctionProperties (cmpval) (assertEquals (cmpval, FunctionFunctionProperties.value);) var VariableFunctionProperties = function (cmpval) (assertEquals (cmpval, VariableFunctionProperties.value);) var startIndex = VariableFunctionProperties . toString (). indexOf ("{"); var endIndex = VariableFunctionProperties.toString (). lastIndexOf ("}"); var buffer = VariableFunctionProperties.toString (). slice (startIndex + 1, endIndex); var InstantiatedFunctionProperties = new -Funktion ( "cmpval", buffer);

Dieses Beispiel zeigt drei Funktions-Deklarationen, wobei jede Erklärung zur Veranschaulichung eine andere Möglichkeit, eine Funktion Instanz zu deklarieren. Die erste Erklärung, FunctionFunctionProperties, ist der traditionelle Ansatz. Die zweite Erklärung, VariableFunctionProperties, wird eine Variable und eine anonyme Funktion. Und die dritte Erklärung, InstantiatedFunctionProperties, ist eine explizite Instanziierung des Function-Objekts, wo der Konstruktor Parameter der Erklärung der Parameter repräsentieren, und der letzte Parameter ist die Funktion Körper.

Die Funktion Körper ist ein Puffer von JavaScript-Code in ausführbare JavaScript umgewandelt wird. Für jede der drei Funktionstasten Implementierungen, ist der Name der Funktion verwiesen und mit einem Verweis auf die Eigenschaft Wert angehängt. Mit jeder und jede Funktion Beispiel können Sie eine Eigenschaft zuzuweisen oder, wenn Sie es wünschen, eine andere Funktion Referenz. Sie können Eigenschaften wie eine Möglichkeit, eine statische Variable, die mit der Funktion verbunden ist, erklären zu denken. Da jede der drei Erklärungen Funktion stellt ein Objekt und eine Variable, können sie in gleicher Weise genannt werden, wie im folgenden Beispiel dargestellt.

 Quelle: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html function_with_properties: function () (VariableFunctionProperties.value = 10; VariableFunctionProperties (10); FunctionFunctionProperties.value = 10; FunctionFunctionProperties (10); InstantiatedFunctionProperties.value = 10; InstantiatedFunctionProperties (10) ; testManager.success ();)

Den Code zu lesen, dass die angegebene Funktionen aufruft dauert ein wenig gewöhnungsbedürftig. Vor jeder Funktion aufrufen, wird die Kennung genutzt wird, als ob es ein Objekt wurden. Nachdem das Objekt verwiesen wird, wird das Objekt als eine Funktion aufgerufen. Diese Beispiele zeigen deutlich, dass eine doppelte Funktionen der Natur, wo Funktionen sind Objekte und Objekte können Funktionen. Dieser duale Charakter ergibt sich ein Problem: Wie funktioniert die Funktion Umsetzung kennen die Instanz der Funktion? Der folgende Code veranschaulicht dieses Problem.

 Quelle: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html function_with_properties: function () (VariableFunctionProperties.value = 10; VariableFunctionProperties (10); FunctionFunctionProperties.value = 10; FunctionFunctionProperties (10); InstantiatedFunctionProperties.value = 10; InstantiatedFunctionProperties (10) ; testManager.success ();)

Den Code zu lesen, dass die angegebene Funktionen aufruft dauert ein wenig gewöhnungsbedürftig. Vor jeder Funktion aufrufen, wird die Kennung genutzt wird, als ob es ein Objekt wurden. Nachdem das Objekt verwiesen wird, wird das Objekt als eine Funktion aufgerufen. Diese Beispiele zeigen deutlich, dass eine doppelte Funktionen der Natur, wo Funktionen sind Objekte und Objekte können Funktionen. Dieser duale Charakter ergibt sich ein Problem: Wie funktioniert die Funktion Umsetzung kennen die Instanz der Funktion? Der folgende Code veranschaulicht dieses Problem.

 Quelle: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html Funktion GetFunction () (return function (cmpvalue) (assertEquals (cmpval, unknownfunctioninstance. value);))

In dem Beispiel hat die GetFunction Funktion einer Implementierung, gibt eine eindeutige Funktion beispielsweise jedes Mal GetFunction aufgerufen wird. Wenn Sie wollten, auf ein Objekt der Funktion beispielsweise, würden Sie sich schwer tun, dies zu tun, denn eine anonyme Funktion hat keine Kennung zugeordnet. In den vorangegangenen Beispielen wurde der Verweis auf die Funktion beispielsweise die Bezugnahme auf die Eigenschaften und Methoden der Funktion Objekt. Mit dieser Art und Weise zu erklären, die Funktion gibt es keine Instanz-ID zugeordnet, und keine Möglichkeit, in der Lage sein Verweis auf die Eigenschaft der anonymen Funktion. Die Lösung wird auf eine interne Variable, auf die verwiesen wird, wie das folgende Beispiel zeigt, verwenden.

 Quelle: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html Funktion GetFunctionFixed () (var inst = function (cmpval) (assertEquals (cmpval, inst.value);) return ds;)

Wie Sie den Code, behebt das Problem der unbekannten Instanz tatsächlich funktioniert sogar vielleicht ein wenig geheimnisvoll auf den ersten Blick. Es geht um die Verwendung einer Programmiersprache Technik gemeinhin als bekannt Schließung. Um zu verstehen, wie Verschlüsse arbeiten, denken Sie daran, der eine Funktion als ein Objekt zu denken, nicht eine Funktion Stichworten zu konstruieren. Here's what happens in Kürze:

1. Der Anrufer nennt GetFunctionFixed.

2. Die Umsetzung der GetFunctionFixed ausgeführt wird.

3. Eine anonyme Funktion erklärt wird, sowie ein Function-Objekt instanziiert wird.

4. Die instanziiert anonyme Funktion zugeordnet ist, die lokale Variable deklariert inst.

5. Die anonyme Funktion Verweise inst, und die JavaScript-Prozessor versteht und erstellt einen Verweis auf die lokale Variable deklariert.

6. Die inst Variable wird an den Aufrufer zurückgegeben.

7. Der Garbage Collector versucht, Müll zu sammeln inst, aber es kann nicht, weil die anonyme Funktion Verweise inst solange anonym ist irgendwo verwiesen wird. Wenn man bedenkt, die Schritte in diesem Prozess zusammen mit der Tatsache, dass alles, was ein Objekt ist, wird es leicht zu sehen, wie dieser Code funktioniert. Wenn ein Objekt ein anderes Objekt verweist, können die Objekte nur Müll gesammelt, wenn sie sich nicht auf irgendetwas zu tun. Bei der Verwendung von Funktionen und behandelt sie als Objekte, halten Sie die folgenden Punkte beachten:

• Funktionen sind Objekte, und Sie können sie wie jeder andere JavaScript-Objekte zu manipulieren. Allerdings, da Funktionen Objekte sind, die Verwendung von Funktionen nicht ordnungsgemäß oder nicht ordnungsgemäß Eigenschaften von Funktionen kann dazu führen, Memory Leaks, Wo das Gedächtnis verwiesen wird und nicht Müll gesammelt, auch wenn das Skript nicht die Nutzung der Speicher.

• Eine Konfiguration von Funktionen oder Methoden ist möglich, wenn die HTML-Seite geladen wird. Das spart Verarbeitungslogik, wie der Code nicht brauchen, um festzustellen, welcher Code ausgeführt werden soll.

• Es braucht ein wenig Zeit und Experimentieren auf die Idee, dass das Verhalten von Code zur Laufzeit bestimmt gewöhnen, und nicht, während Sie den Code schreiben wollen.

• Als Objekte, Funktionen verweisen können Eigenschaften oder Methoden, so dass Funktionen, um das Verhalten während der Laufzeit zu definieren. Wenn Sie die Eigenschaften und Methoden, um Funktionen zuweisen, dann tue es mit dem Verständnis, dass die Eigenschaften und Methoden vorübergehender Natur sind, dh wenn eine Funktion von einer Instanz auf eine andere kopiert werden, nicht davon ausgehen, dass die Eigenschaften auch kopiert werden.

Ein Artikel eingereicht von Sonja Lande


Disclaimer:Unsere Website ist nicht verantwortlich für den Inhalt dieses Artikels. Webarticles ist eine kostenlose Informationsquelle.
Wichtig: Dieser Artikel "JavaScripot Funktionen" wurde durch ein automatisches Software übersetzt. Wir fühlen uns leid für alle Rechtschreibfehler, die möglicherweise aufgetreten sind. Vielen Dank für Ihr Verständnis.


Online: 450 users browsing the articles directory