Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

OOP mit JavaScript Grundkurs

Das anonyme globale Objekt

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Da JavaScript "hybrid" konzipiert ist, kann man je nach Bedarf objektorientiert, prozedural oder funktional programmieren. Um Funktionen und globale Variablen dennoch in ein objektorientiertes Konzept einfügen zu können, hat man ein anonymes globales Objekt eingeführt, das mit Hilfe des this-Operators angesprochen wird. In dem Video erfahren Sie Näheres und lernen das dahinterstehende Konzept kennen.
09:12

Transkript

Es ist für JavaScript Programmierer elementar zu wissen, wann sie mit dem sogenannten Globalen Objekt arbeiten und wann nicht. Dabei geht es grundsätzlich um globale Variablen respektive Funktion. Es sollte bekannt sein, dass globale Variablen Informationen aus verschiedenen Programmteilen vermengen und deshalb werden sie möglichst nicht mehr eingesetzt. Das ist eine klare Ansage für guten JavaScript Code. Allerdings muss man zwischen global und implied globals, implizites Global unterscheiden. Ich habe hier ein Beispiel vorbereitet, um mit impliziten globalen Variablen zu arbeiten im Gegensatz zu echten globalen Variablen. Was hat das für Effekte? Wann gehört was zu diesem sogenannten globalen Objekt, dem anonymen globalen Objekt? Wir betrachten einmal eine sicherlich bekannte Situation, dass Sie eine Variable einführen und stellen das Schlüsselwort var voran. z1 wird also mit var eingeführt, z2 wird hier auch deklariert, aber ohne dieses vorangestellte var. Hat das Konsequenzen? Nun, in der normalen Anwendung nicht direkt. Beide Variablen sind in gewisser Weise global verfügbar im gesamten Skript. Trotzdem gibt es einen gravierenden Unterschied. Das sehen wir hier, wenn Sie sich diese Schrittfolge hier ansehen, was ich mit diesen beiden Variablen mache. Ich gebe zuerst den Wert von z1 aus und dann lasse ich mir den Typ anzeigen. Das ist relativ klar, dass hier der Wert 1 und der Typ Number auftaucht. Das mache ich mit z2 auch und hier sehen Sie keinen Unterschied. Ich benutze dann aber eine Standardfunktion von JavaScript, um beide Variablen zu löschen. Ich versuche sie zu löschen und danach lasse ich mir die Typen von den beiden Variablen wieder ausgeben. Wenn sich eine Variable wirklich mit Delete löschen lässt, dann darf hier kein Number mehr auftauchen, sondern es muss undefined zu sehen sein. Und wir schauen uns mal an, was hier raus kommt. Das ist das Resultat. Also wir haben zuerst die 1, number, 1, number. Dann kommt die Delete-Aktion von z1 und dann die Delete-Aktion von z2. Sie sehen aber, dass der Typ von z1 nach dem Löschen immer noch Number ist, der von z2 aber undefined. Also konnte ich offensichtlich mit Delete z1 nicht löschen, z2 konnte ich aber löschen. Und das deutet schon darauf hin, dass wir hier zwei unterschiedliche Welten vorliegen haben. Eine echte globale Variable, wie sie hier mit var deklariert wird, lässt sich nicht mit Delete löschen. Eine sogenannte implied global, eine implizit globale Variable, lässt sich mit Delete löschen. Diese implied globals werden als echte Properties, also Eigenschaften dieses sogenannten anonymen globalen Objekts verstanden. Schauen wir uns noch mal ein paar weitere Aktionen an, die hier in diesem Skript ablaufen. Ich habe hier eine Funktion deklariert, Summe. Und hier wird eine Variable Result eingeführt. Sie ist damit nicht lokal. Sie ist globalisiert, hatte ich gesagt, aber sie ist implizit globalisiert. Es ist also eine Property von dem globalen Objekt. Ich gebe mal hier den Wert aus von dieser Funktion. Das heißt, Sie sehen hier einen Funktionsaufruf und danach versuche ich den Wert dieser implizit globalen Variable auszugeben und den Typ. Danach lösche ich diese Variable. Es spielt keine Rolle, ob ich hier this.result hinschreibe oder result. Mit this greift man immer auf das globale anonyme Objekt zu. Und da ich diese Variablen ja löschen kann, diese Properties, taucht danach hier undefined auf. Wir schauen uns das an. Also hier der Rückgabewert der Funktion, dann der Zugriff auf diese implizit globale Variable Result, dann der Typ dieser implizit globalen Variable Result und das ist dann nach der Delete-Aktion undefined. Es gibt noch weitere Aktionen, die sicherlich die Sache noch verdeutlichen. Man kann dummerweise bei JavaScript so etwas machen: Eine Verkettung von Zuweisungen, die dann von rechts nach links ausgeführt werden. Ich habe hier eine lokale Variable a. Durch var ist die ja lokal. Aber ich weise den Wert von b zu und b ist implizit global. Die Auswertung erfolgt von rechts nach links, also von daher wird zuerst b implizit global angelegt und dann aber a zugewiesen. Und das heißt, ich kann hier über this.b auf den Wert 1 zugreifen und der ist ja implizit global, aber was liefert this.a? a ist lokal, also kann es nicht zugänglich sein und liefert undefined. Da sehen Sie das. Und typeof b liefert natürlich Number. Da können Sie hier auch gerade noch erkennen. Dann lösche ich aber b und lasse mir danach den Wert von b wieder ausgeben, aber das es ja eine implizit globale Variable ist, also Teil des globalen Objekts, kann ich mit Delete löschen und danach ist der Typ von b undefined. Ich habe danach noch etwas Code geschrieben, der den Zusammenhang zwischen Funktionen und Methoden des globalen Objekts zeigen soll. Mit this.test lege ich eine Methode im globalen Objekt an. Ich rufe sie danach auf genauso wie ich eine normale Funktion aufrufen würde. Ich kann auch this.test hinschreiben. Das spielt keine Rolle. Ich habe hier mehrere Ausgaben jetzt. Einmal natürliche die Testausgabe, dann aber den Typ einer normalen Funktion, dann versuche ich, diese normale Funktion mit Delete zu löschen, gucke mir wieder den Typ an, werde sehen, dass es nicht funktioniert, aber dann versuche ich eben diese Methode des globalen Objektes zu löschen und ich werde sehen, das funktioniert. Hier sehen Sie das. Testausgabe, die beiden Ausgaben des Typs von Summe, die zeigen, mit Delete kann ich das nicht löschen, weil es globale Funktionen sind während die Eigenschaften des gloalen Objekts, das ist ja ein Zeiger auf die Methode Test, jederzeit mit Delete gelöscht werden können. Fassen wir zusammen. Implied globals sind echte Properties des globalen Objekts und das globale Objekt sammelt in gewisser Weise in einem global verfügbaren Namensraum Dinge in einem objektorientierten Kontext, die man früher mit rein globalen Variablen respektive Funktionen gelöst hat. Um allerdings zum Abschluss noch eine kleine Warnung nachzuschicken: Es soll nicht der Eindruck entstehen, dass die Verwendung des anonymen globalen Objektes gut ist, denn der Strict Modus, der mit neuen Versionen von JavaScript kommt und einige Browser auch jetzt schon unterstützen, der verhindert ja solche Dinge wie beispielsweise hier eine Zuweisung eines Wertes zu einer Variablen ohne Deklaration. Also allgemein sind weder globale Variablen noch die Verwendung des anonymen globalen Objekts wirklich zu empfehlen.

OOP mit JavaScript Grundkurs

Sehen Sie, wie Sie mit JavaScript objektorientiert programmieren können.

3 Std. 8 min (35 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:09.03.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!