<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-x-formal">
	<id>https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lawrence</id>
	<title>GlossarWiki - Benutzerbeiträge [de-formal]</title>
	<link rel="self" type="application/atom+xml" href="https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lawrence"/>
	<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/Spezial:Beitr%C3%A4ge/Lawrence"/>
	<updated>2026-07-16T15:53:07Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2016:Praktikum:Pr%C3%BCfung&amp;diff=39296</id>
		<title>MMProg:WiSe2016:Praktikum:Prüfung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2016:Praktikum:Pr%C3%BCfung&amp;diff=39296"/>
		<updated>2016-07-11T19:29:07Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „==Organisatorisches==  * Dauer: 3 Stunden * Personalausweis wird benötigt * Liste muss ausgefüllt und unterschrieben werden * Sie dürfen keine Mobiltelefone…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Organisatorisches==&lt;br /&gt;
&lt;br /&gt;
* Dauer: 3 Stunden&lt;br /&gt;
* Personalausweis wird benötigt&lt;br /&gt;
* Liste muss ausgefüllt und unterschrieben werden&lt;br /&gt;
* Sie dürfen keine Mobiltelefone und kein mitgebrachtes Material nutzen&lt;br /&gt;
* Sie dürfen sich nicht mit anderen Prüflingen unterhalten&lt;br /&gt;
* Falls Sie versuchen nachträglich in Ihr Prüfungsverzeichnis zu commiten, sind Sie durchgefallen&lt;br /&gt;
* Die Prüfung besteht aus 2 Teilen (teil1 und teil2)&lt;br /&gt;
* Die Beschreibungen sind jeweils in &amp;quot;index.md&amp;quot;-Dateien zu finden&lt;br /&gt;
* &#039;&#039;&#039;Auf den Laborrechnern ist nur Firefox installiert, kein Chrome!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Start der Prüfung==&lt;br /&gt;
&lt;br /&gt;
* Terminal vom Schreibtisch aus öffnen&lt;br /&gt;
* Im Terminal den Befehl &amp;quot;./setupenv.sh RZ-Kennung&amp;quot; mit eigener RZ-Kennung ausführen&lt;br /&gt;
* Das eigene RZ-Passwort eingeben falls aufgefordert&lt;br /&gt;
* WebStorm vom Schreibtisch aus öffnen&lt;br /&gt;
* In WebStorm das Verzeichnis &amp;quot;repository&amp;quot; auf dem Schreibtisch öffnen&lt;br /&gt;
* Im Projektbaum in WebStorm zum Verzeichnis &amp;quot;pruefung_20160712&amp;quot; navigieren&lt;br /&gt;
* Dort die Datei &amp;quot;index.md&amp;quot; öffnen und &#039;&#039;&#039;alles durchlesen&#039;&#039;&#039;&lt;br /&gt;
* Anschließend Teil 1 und Teil 2 der Prüfung bearbeiten&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Physics&amp;diff=38271</id>
		<title>JavaScript-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Physics&amp;diff=38271"/>
		<updated>2015-10-22T20:48:58Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Physics=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unter Physics versteht man in der Informatik die Simulation physikalischer Gesetze wie Geschwindigkeit und Erdanziehung.&lt;br /&gt;
In der Spieleprogrammierung werden Physics verwendet um Spielmechaniken natürlicher wirken zu lassen.&lt;br /&gt;
&lt;br /&gt;
Dieses Tutorium erklärt simple Formeln und Berechnungen für die Entwicklung von Simulationen in JavaScript.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemeines==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zugehörigkeit===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer Modellierung nach Model-View-Controller stellt sich die Frage wo der Code für physikalische Simulationen hingehört.&lt;br /&gt;
Versteht man das Model so, dass es neben den Daten auch die Logik enthält, so schliesst dies den Physics-Code eindeutig ein.&lt;br /&gt;
Die Gegebenheit, dass ein Spiel physikalischen Gesetzen folgt, kann also wie jede andere Regel des Spiels verstanden werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abstrakte Einheiten===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gegebenenfalls ist es sinnvoll ein Koordinatensystem einzuführen und Spielelemente mit Dimensionen zu versehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Player = function(x, y, width, height) {&lt;br /&gt;
  this.x = x;&lt;br /&gt;
  this.y = y;&lt;br /&gt;
  this.width = width;&lt;br /&gt;
  this.height = height;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist dabei, dass diese Einheiten keinen direkten Bezug zu Pixel haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sollen das Model und die View mit unterschiedlichen Zahlensystem arbeiten, kann ein Skalierungsfaktor verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var renderPlayer = function(player, scaleFactor) {&lt;br /&gt;
  var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
  div.style.position = &#039;absolute&#039;;&lt;br /&gt;
  div.style.backgroundColor = &#039;#F00&#039;;&lt;br /&gt;
  div.style.width = player.width * scaleFactor + &#039;px&#039;;&lt;br /&gt;
  div.style.height = player.height * scaleFactor + &#039;px&#039;;&lt;br /&gt;
  div.style.left = player.x * scaleFactor  + &#039;px&#039;;&lt;br /&gt;
  div.style.top = player.y * scaleFactor+ &#039;px&#039;;&lt;br /&gt;
  document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var player1 = new Player(10, 10, 10, 10);&lt;br /&gt;
renderPlayer(player1, 5);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst Spiele wie &amp;quot;Tic Tac Toe&amp;quot; arbeiten mit Koordinatensystemen, oftmals vereinfacht als multidimensionales Array dargestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var TicTacToe = function() {&lt;br /&gt;
  this._spielfeld = [&lt;br /&gt;
    [&#039;&#039;, &#039;&#039;, &#039;&#039;],&lt;br /&gt;
    [&#039;&#039;, &#039;&#039;, &#039;&#039;],&lt;br /&gt;
    [&#039;&#039;, &#039;&#039;, &#039;&#039;]&lt;br /&gt;
  ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Welt und Elemente===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Physics-Simulation ist es sinnvoll das Modell in eine Welt und deren enthaltenen Elemente aufzuteilen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Element = function(x, y, width, height) {&lt;br /&gt;
  this.x = x;&lt;br /&gt;
  this.y = y;&lt;br /&gt;
  this.width = width;&lt;br /&gt;
  this.height = height;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei kapseln Elemente ihre physikalischen Eigenschaften, während die Welt regelmäßig ihre Berechnungen auf diese anwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Berechnungen werden mithilfe von eigenständigen Timern durchgeführt, ähnlich wie beim Rendering.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var World = function(elements) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self._elements = elements;&lt;br /&gt;
&lt;br /&gt;
  self._updateElements = function() {&lt;br /&gt;
    for (var i = 0; i &amp;lt; self._elements.length; i++) {&lt;br /&gt;
      // TODO: Your code goes here&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  self._updateElementsRepeatedly = function() {&lt;br /&gt;
    self._updateElements();&lt;br /&gt;
    setTimeout(self._updateElementsRepeatedly, 15);&lt;br /&gt;
  };&lt;br /&gt;
  self._updateElementsRepeatedly();&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ortsänderungen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nahezu jedes Spiel, welches eine physikalischen Simulation beinhaltet, arbeitet mit der Veränderung vom Ort einzelner Elemente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Geschwindigkeit===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine simple Simulation von Geschwindigkeit kann bereits erreicht werden indem man die Koordinaten von Objekten verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
self._updateElements = function() {&lt;br /&gt;
  for (var i = 0; i &amp;lt; self._objects.length; i++) {&lt;br /&gt;
    self._objects[i].x += 1;&lt;br /&gt;
    self._objects[i].y += 1;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Geschwindigkeitsattributen können Objekte selbst entscheiden wie sich ihre Koordinaten verändern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Element = function(x, y) {&lt;br /&gt;
  this.x = x;&lt;br /&gt;
  this.y = y;&lt;br /&gt;
  this.vx = 0;&lt;br /&gt;
  this.vy = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var element = new Element(0, 0);&lt;br /&gt;
element.vx = 1;&lt;br /&gt;
element.vy = 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
self._updateElements = function() {&lt;br /&gt;
  for (var i = 0; i &amp;lt; self._elements.length; i++) {&lt;br /&gt;
    self._elements[i].x += self._elements[i].vx;&lt;br /&gt;
    self._elements[i].y += self._elements[i].vy;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist Konvention Geschwindigkeitsattribute mit einem &amp;quot;v&amp;quot; zu versehen, welches für &amp;quot;Velocity&amp;quot; steht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verknüpft man die Steuerung der Geschwindigkeitswerte mit dem Keyboard erreicht man eine einfache Spielersteuerung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Controller = function(element) {&lt;br /&gt;
  document.addEventLister(&#039;keydown&#039;, function(event) {&lt;br /&gt;
    if (event.keyCode == 37) {&lt;br /&gt;
      element.vx = -0.5;&lt;br /&gt;
    }&lt;br /&gt;
    if (event.keyCode == 39) {&lt;br /&gt;
      element.vx = 0.5;&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  document.addEventLister(&#039;keyup&#039;, function() {&lt;br /&gt;
    element.vx = 0;&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beschleunigung===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neben der Geschwindigkeit ist die Beschleunigung ein weiterer wichtiger Faktor für physikalische Simulationen in Spielen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Element = function(x, y) {&lt;br /&gt;
  this.x = x;&lt;br /&gt;
  this.y = y;&lt;br /&gt;
  this.vx = 0;&lt;br /&gt;
  this.vy = 0;&lt;br /&gt;
  this.ax = 0;&lt;br /&gt;
  this.ay = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var element = new Element(0, 0);&lt;br /&gt;
element.vx = 1;&lt;br /&gt;
element.ay = .1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschleunigung verhält sich zu Geschwindigkeit wie Geschwindigkeit zu Ort, also eine konstante Änderung der Geschwindigkeit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
self._updateElements = function() {&lt;br /&gt;
  var element = null;&lt;br /&gt;
  for (var i = 0; i &amp;lt; self._elements.length; i++) {&lt;br /&gt;
    var element = self._elements[i];&lt;br /&gt;
    element.vx += element.ax;&lt;br /&gt;
    element.vy += element.ay;&lt;br /&gt;
    element.x += element.vx;&lt;br /&gt;
    element.y += element.vy;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erdanziehung===&lt;br /&gt;
&lt;br /&gt;
Ein häufiger Einsatzzweck der Beschleunigung ist die vereinfachte Simulation einer global angewendeten Erdanziehungskraft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
self._gy = 0.1;&lt;br /&gt;
self._updateElements = function() {&lt;br /&gt;
  var element = null;&lt;br /&gt;
  for (var i = 0; i &amp;lt; self._elements.length; i++) {&lt;br /&gt;
    element = self._elements[i];&lt;br /&gt;
    element.vx += element.ax;&lt;br /&gt;
    element.vy += element.ay + self._gy;&lt;br /&gt;
    element.y += element.vy;&lt;br /&gt;
    element.y += element.vy;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Unbewegliche Objekte===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Häufig gibt es in Simulationen auch unbewegliche Objekte welche nicht von Ortsänderungen betroffen sein sollen.&lt;br /&gt;
Diese können einfach mit einer boolschen Eigenschaft versehen werden welche dann in der Welt abgefragt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
self._updateElements = function() {&lt;br /&gt;
  var element = null;&lt;br /&gt;
  for (var i = 0; i &amp;lt; self._elements.length; i++) {&lt;br /&gt;
    element = self._elements[i];&lt;br /&gt;
    if (!element.isImmovable) {&lt;br /&gt;
      element.vx += element.ax;&lt;br /&gt;
      element.vy += element.ay + self._gy;&lt;br /&gt;
      element.y += element.vy;&lt;br /&gt;
      element.y += element.vy;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kollisionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In vielen Spielen ist es das Ziel mit dem Spieler bestimmte Elemente zu treffen und anderen Elementen wiederum auszuweichen.&lt;br /&gt;
Diese Gegebenheit lässt sich in der Regel mittels vereinfachter Kollisionserkennung und Kollisionauflösung umsetzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Begrenzungen===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein spezielles Element mit dem der Spieler in fast jedem Spiel kollideren kann ist die Welt selbst bzw. deren Begrenzung.&lt;br /&gt;
Da es sich normalerwise um eine rechteckige Begrenzung handelt kann leicht überprüft werden ob eine Kollision stattfindet.&lt;br /&gt;
Darf der Spieler die Welt nicht verlassen so können seine physikalischen Attribute einfach entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (element.x &amp;lt; 0) {&lt;br /&gt;
  element.x = 0;&lt;br /&gt;
  element.vx = element.ax = 0;&lt;br /&gt;
}&lt;br /&gt;
if (element.x + element.width &amp;gt; self._width) {&lt;br /&gt;
  element.x = self._width - element.width;&lt;br /&gt;
  element.vx = element.ax = 0;&lt;br /&gt;
}&lt;br /&gt;
if (element.y &amp;lt; 0) {&lt;br /&gt;
  element.y = 0;&lt;br /&gt;
  element.vy = element.ay = 0;&lt;br /&gt;
}&lt;br /&gt;
if (element.y + element.height &amp;gt; self._height) {&lt;br /&gt;
  element.y = self._height - element.height;&lt;br /&gt;
  element.vy = element.ay = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Man sollte ebenso darauf achten die x- und y-Position des mit der Welt kollidierenden Elements anzupassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kollisionserkennung===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit um Kollisionen zwischen Objekten zu erkennen ist die Verwendung von &amp;quot;Bounding Boxes&amp;quot;.&lt;br /&gt;
Dabei berechnet man für jedes Objektes das kleinst mögliche Rechteck und verwendet dies zur Kollisionserkennung.&lt;br /&gt;
Die Berechnung um festzustellen ob sich zwei nicht gedrehte Rechtecke überschneiden gestaltet ist sehr einfach.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
self._areElementsColliding = function(a, b) {&lt;br /&gt;
  if ((a.x &amp;gt; b.x + b.width) || (b.x &amp;gt; a.x + a.width)) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  else if ((a.y &amp;gt; b.y + b.height) || (b.y &amp;gt; a.y + a.height)) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  return true;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist die Kollisionserkennung für zwei Kreisformen relativ einfach zu berechnen.&lt;br /&gt;
Kombiniert man jedoch Kreise und Rechtecke erhöht sich die Komplexität aufgrund der Fallunterscheidungen.&lt;br /&gt;
Es ist empfehlenswert Kreise ebenfalls als Rechtecke aufzufassen solange keine exakte Erkennung notwendig ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für die Kollisionserkennung aller Elemente innerhalb einer Welt kann man eine verschachtelte &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleife nutzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
self._detectCollisions = function() {&lt;br /&gt;
  var a = null, b = null;&lt;br /&gt;
  for (var i = 0; i &amp;lt; self._elements.length - 1; i++) {&lt;br /&gt;
    a = self._elements[i];&lt;br /&gt;
    for (var j = i + 1; j &amp;lt; self._elements.length; i++) {&lt;br /&gt;
      b = self._elements[j];&lt;br /&gt;
      // TODO: Your code goes here&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Weise wird jede mögliche Zweierkombination von Elementen garantiert auch nur einmal durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kollisionstiefe===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um zu wissen aus welcher Richtung die Elemente sich angenähert haben kann die Kollisionstiefe der Achsen berechnet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
self._getCollisionDepth = function(a, b) {&lt;br /&gt;
  var xValues = [a.x, a.x + a.width, b.x, b.x + b.width];&lt;br /&gt;
  var yValues = [a.y, a.y + a.height, b.y, b.y + b.height];&lt;br /&gt;
  var sort = function(firstValue, secondValue) {&lt;br /&gt;
    return firstValue - secondValue;&lt;br /&gt;
  };&lt;br /&gt;
  xValues.sort(sort);&lt;br /&gt;
  yValues.sort(sort);&lt;br /&gt;
  return {&lt;br /&gt;
    x: xValues[2] - xValues[1],&lt;br /&gt;
    y: yValues[2] - yValues[1]&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beträgt die x-Tiefe einen niedrigeren Wert als die y-Tiefe nähern sich die Elemente horizontal an, im anderen Fall vertikal.&lt;br /&gt;
Bei einer horizontalen Annäherung zweier Elemente bezeichnet man die y-Achse als die Kollisionsachse, andernfalls die x-Achse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var collisionDepth = self._getCollisionDepth(a, b);&lt;br /&gt;
var collisionAxis = collisionDepth.x &amp;lt; collisionDepth.y ? &#039;y&#039; : &#039;x&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reaktion auf Kollision===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abhängig davon welche Elemente wie kollidieren und welche Spielregeln existieren kann es unterschiedliche Reaktionen geben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Umkehrung von Geschwindigkeit====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei beweglichen Elementen in einer Kollision ist es sinnvoll die Geschwindigkeitsanteile entlang der Kollisionsachse umzukehren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var collisionDepth = self._getCollisionDepth(a, b);&lt;br /&gt;
var collisionAxis = collisionDepth.x &amp;gt; collisionDepth.y ? &#039;y&#039; : &#039;x&#039;;&lt;br /&gt;
if (collisionAxis == &#039;y&#039;) {&lt;br /&gt;
  a.vx *= -1;&lt;br /&gt;
  b.vx *= -1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  a.vy *= -1;&lt;br /&gt;
  b.vy *= -1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein Ball fliegt mit einer Geschwindigkeit vx von 2 und vy von 1, also nach rechts unten, gegen ein unbewegliches Hindernis unter ihm.&lt;br /&gt;
Für die Kollisionstiefe ergibt sich im x-Anteil einen größeren Wert als für y, dementsprechend ist x die Kollisionsachse.&lt;br /&gt;
&lt;br /&gt;
Der y-Anteil der Geschwindigkeit vom Ball wird umgekehrt auf -1, sodass der Ball sich weiter nach rechts oben bewegt.&lt;br /&gt;
Die Geschwindigkeit des Hindernisses braucht nicht umgekehrt werden, da es sich um ein unbewegliches Element handelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auflösung von Kollision====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Umkehrung der Geschwindigkeitsanteile führt in der Regel dazu, dass sich die Kollision wieder von selbst auflöst.&lt;br /&gt;
Sollen die Elemente jedoch angehalten werden, muss die entstandene Überschneidung rückgängig gemacht werden.&lt;br /&gt;
Dazu werden die Elemente je nach ihrer Geschwindigkeit und Beweglichkeit um Anteile der Kollisionstiefe auseinander gezogen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var collisionDepth = self._getCollisionDepth(a, b);&lt;br /&gt;
var collisionAxis = collisionDepth.x &amp;gt; collisionDepth.y ? &#039;y&#039; : &#039;x&#039;;&lt;br /&gt;
if (collisionAxis == &#039;y&#039;) {&lt;br /&gt;
  if (a.vx &amp;gt; 0) {&lt;br /&gt;
    a.x -= (collisionDepth.x / 2);&lt;br /&gt;
    b.x += (collisionDepth.x / 2);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    a.x += (collisionDepth.x / 2);&lt;br /&gt;
    b.x -= (collisionDepth.x / 2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  if (a.vy &amp;gt; 0) {&lt;br /&gt;
    a.y -= (collisionDepth.y / 2);&lt;br /&gt;
    b.y += (collisionDepth.y / 2);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    a.y += (collisionDepth.y / 2);&lt;br /&gt;
    b.y -= (collisionDepth.y / 2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gibt es nur ein bewegliches Element wird nur dieses um die Kollisionstiefe entgegen der Geschwindigkeitsrichtung zurückbewegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var collisionDepth = self._getCollisionDepth(a, b);&lt;br /&gt;
var collisionAxis = collisionDepth.x &amp;gt; collisionDepth.y ? &#039;y&#039; : &#039;x&#039;;&lt;br /&gt;
if (collisionAxis == &#039;y&#039;) {&lt;br /&gt;
  if (a.isImmovable) {&lt;br /&gt;
    b.x += b.vx &amp;gt; 0 ? -collisionDepth.x : collisionDepth.x;&lt;br /&gt;
  }&lt;br /&gt;
  else if (b.isImmovable) {&lt;br /&gt;
    a.x += a.vx &amp;gt; 0 ? -collisionDepth.x : collisionDepth.x;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  if (a.isImmovable) {&lt;br /&gt;
    b.y += b.vy &amp;gt; 0 ? -collisionDepth.y : collisionDepth.y;&lt;br /&gt;
  }&lt;br /&gt;
  else if (b.isImmovable) {&lt;br /&gt;
    a.y += a.vy &amp;gt; 0 ? -collisionDepth.y : collisionDepth.y;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ereignisse====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unabhgängig davon wie und ob auf Kollisionen reagiert wird ist es sinnvoll bei jeder Kollision ein Ereignis zu erzeugen.&lt;br /&gt;
Auf diese Weise können anderen Programmkomponenten diese Information zu verarbeiten und z.B. visuell darzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Nutzen Sie den &amp;lt;code&amp;gt;EventDispatcher&amp;lt;/code&amp;gt; um Ereignisse zu erzeugen wenn Kollisionen auftreten.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_9&amp;diff=38270</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 9</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_9&amp;diff=38270"/>
		<updated>2015-10-22T19:44:56Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 9=  ==Physics==  ===Ziel===  Ziel dieser Aufgabe ist es einfache physikalische Berechnungen innerhalb vom Model einer MVC-Anwendung zu imple…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 9=&lt;br /&gt;
&lt;br /&gt;
==Physics==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es einfache physikalische Berechnungen innerhalb vom Model einer MVC-Anwendung zu implementieren.&lt;br /&gt;
Orientieren Sie sich für die Berechnungen an dem in der Vorlesung behandelten&lt;br /&gt;
[http://glossar.hs-augsburg.de/JavaScript-Tutorium:Physics Tutorium] für Physics in JavaScript.&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie einen neuen Ordner namens &amp;quot;aufgabe9&amp;quot; innerhalb Ihres Verzeichnis für die Praktikumsaufgaben.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Vorlagenordner &amp;quot;aufgabe9/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Die Vorlage enthält eine nach MVC modellierte Anwendung, welche Elemente nach einfach physikalischen Gesetzen bewegen soll.&lt;br /&gt;
Den gesamten Code für die Berechnungen im Model sowie für die Spielersteuerung im Controller müssen Sie selbst implementieren.&lt;br /&gt;
Suchen Sie in &amp;quot;index.js&amp;quot;, &amp;quot;World.js&amp;quot;, &amp;quot;GameController.js&amp;quot; und &amp;quot;PlayerKeyboardController.js&amp;quot; nach den &amp;quot;TODO&amp;quot;-Kommentaren.&lt;br /&gt;
&lt;br /&gt;
===Geschwindigkeit===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie die physikalische Welt so, dass alle Elemente bei jeder Neuberechnung ihre x- und y-Position um 0.5 verändern.&lt;br /&gt;
Dies führt dazu, dass sich das grüne Objekt mit einer konstanten Geschwindigkeit nach rechts unten bewegt.&lt;br /&gt;
&lt;br /&gt;
Verändern Sie die Berechnung nun so, dass alle Elemente ihre Position immer um ihre jeweilige Geschwindigkeit verändern.&lt;br /&gt;
Weisen Sie dem Element &amp;quot;player&amp;quot; in der Datei &amp;quot;index.js&amp;quot; eine x-Geschwindigkeit (vx) und y-Geschwindigkeit (vy) von 0.5 zu.&lt;br /&gt;
Dies führt zu dem gleichen Ergebnis mit dem Unterschied, dass das Element definiert welche Geschwindigkeit es hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Keyboard-Steuerung===&lt;br /&gt;
&lt;br /&gt;
Entfernen Sie die Zuweisung einer festen Geschwindigkeit für das Element &amp;quot;player&amp;quot; wieder aus der Datei &amp;quot;index.js.&amp;quot;&lt;br /&gt;
Erweitern Sie den &amp;lt;code&amp;gt;PlayerKeyboardController&amp;lt;/code&amp;gt; so, dass &amp;quot;player&amp;quot; bei bestimmten Events folgende Geschwindigkeiten zugewiesen werden:&lt;br /&gt;
&lt;br /&gt;
* Beim Runterdrücken der linken Cursortaste eine &amp;quot;vx&amp;quot; von 1.0&lt;br /&gt;
* Beim Runterdrücken der rechten Cursortaste eine &amp;quot;vx&amp;quot; von 1.0&lt;br /&gt;
* Beim Loslassen der linken oder rechten Cursortaste eine &amp;quot;vx&amp;quot; 0.0&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass der Spieler / das grüne Rechteckt nun mithilfe der Cursortasten gesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beschleunigung===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie die physikalische Welt so, dass alle Elemente ihre Geschwindigkeit immer um ihre Beschleunigung verändern.&lt;br /&gt;
Weisen Sie dann dem Element &amp;quot;player&amp;quot; in der Datei &amp;quot;index.js&amp;quot; eine vertikale Beschleunigung von 0.05 zu.&lt;br /&gt;
Dies führt dazu, dass das Spielerobjekt konstant nach unten beschleunigt und bald daraufhin das Spielfeld verlässt.&lt;br /&gt;
&lt;br /&gt;
Entfernen Sie die Zuweisung einer festen Beschleunigung für das Element &amp;quot;player&amp;quot; wieder aus der Datei &amp;quot;index.js.&amp;quot;&lt;br /&gt;
Erweitern Sie die Welt so, dass alle Elemente ihre Geschwindigkeit zusätzlich um die globale Beschleunigung verändern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Die globale Beschleunigung wird innerhalb der Welt in den Eigenschaften &amp;quot;_ax&amp;quot; und &amp;quot;_ay&amp;quot; gespeichert.&lt;br /&gt;
Dies führt zu dem gleichen Ergebnis mit dem Unterschied, dass nun die Welt eine Erdanziehungskraft aufweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Begrenzungen===&lt;br /&gt;
&lt;br /&gt;
Implementieren Sie die Funktion &amp;quot;_keepElementsInsideWorld&amp;quot; so, dass Elemente die Begrenzungen der Welt nicht verlassen können.&lt;br /&gt;
Stellen Sie dazu im ersten Schritt fest ob eine horizontale oder vertikale Überschreitung der Begrenzung vorliegt.&lt;br /&gt;
Ist dies der Fall setzen Sie die entsprechenden Geschwindigkeits- und Beschleunigungsanteile auf null zurück.&lt;br /&gt;
Stellen Sie im zweiten Schritt sicher, dass die x- bzw. y-Position bei entsprechender Überschreitung auch korrigiert wird.&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass der Spieler am unteren Boden belibt und die Welt weder nach links noch rechts verlassen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Springen===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie den &amp;lt;code&amp;gt;PlayerKeyboardController&amp;lt;/code&amp;gt; so, dass der Spieler durch Druck auf die Leertase eine vy von -7.5 erhält.&lt;br /&gt;
Dies soll aber nur dann geschehen, wenn die vertikale Geschwindigkeit des Spielers nicht bereits unter 0 ist.&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung führt dazu, dass man den Spieler nun mithilfe der Tastatursteuerung springen lassen kann.&lt;br /&gt;
Bei mehrfachem Drücken der Leertaste kann der Spieler immer höher springen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Plattform===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie die Welt zunächst so, dass alle Elemente mit Eigenschaft &amp;quot;isImmovable&amp;quot; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ihre Position nie verändern.&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie ein Element namens &amp;quot;platform&amp;quot; in der Datei &amp;quot;index.js&amp;quot; mit Koordinaten (200, 200) und Dimensionen (200, 20).&lt;br /&gt;
Weisen Sie dem Element außerdem nach seiner initialen Erstellung für die Eigenschaft &amp;quot;isImmovable&amp;quot; den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; zu.&lt;br /&gt;
Fügen Sie es dann sowohl der Welt hinzu mittels &amp;lt;code&amp;gt;addElement()&amp;lt;/code&amp;gt; als der SVG-View durch von Aufruf von &amp;lt;code&amp;gt;addObjectView()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass ein weiteres Objekt in der Welt erscheint welches sich allerdings nicht Objekt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kollisionserkennung===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie nun die Welt so, dass sie alle Elemente in effizienter Weise darauf überprüft, ob sie miteinander kollidieren.&lt;br /&gt;
Findet eine Kollision statt wird die Kollisionstiefe mithilfe der Funktion &amp;lt;code&amp;gt;_getCollisionDepth()&amp;lt;/code&amp;gt; festgestellt.&lt;br /&gt;
Auf Basis der zurückgelieferten x- und y-Anteile der Kollisionstiefe wird zunächst die Kollisionsachse ermittelt werden.&lt;br /&gt;
Handelt es sich um die y-Achse werden die x-Geschwindigkeiten der Elemente umgekehrt, bei der x-Achse die y-Geschwindigkeiten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Lagern Sie den Code für die Reaktion auf eine Kollision in eine Funktion aus, z.B. mit dem Namen &amp;lt;code&amp;gt;_solveCollision()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass der Spieler auf die Platform springen kann und dort automatisch auf und ab springt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kollisionsverarbeitung===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie die Kollisionauflösung der Welt so, dass sie folgendes Verhalten für zwei Elemente aufweist (genannt a und b):&lt;br /&gt;
&lt;br /&gt;
* falls y die Kollisionsachse ist, wird vx von a und b umgekehrt&lt;br /&gt;
* falls x die Kollisionsachse ist und&lt;br /&gt;
  * a unbweglich ist und b.vy &amp;gt; 0 ist wird b.y um die Kollisionstiefe verringert und b.vy auf 0 gesetzt&lt;br /&gt;
  * b unbweglich ist und a.vy &amp;gt; 0 ist wird a.y um die Kollisionstiefe verringert und a.vy auf 0 gesetzt&lt;br /&gt;
  * keine der beiden oberen Fälle eintritt werden die vy von a und b umgekehrt&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass der Spieler oben auf der Platform stehen bleibt und von unten wieder von der Platform abprallt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Events===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie nun die Kollisionserkennung so, dass bei jeder Kollision ein Ereignis namens &amp;quot;collision&amp;quot; erzeugt wird.&lt;br /&gt;
Erweitern Sie den &amp;lt;code&amp;gt;GameController&amp;lt;/code&amp;gt; so dass bei jeder Platformkollision die y-Position der Platform um .25 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass wenn der Spieler auf der Platform steht diese sich konstant langsam nach unten bewegt.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_8&amp;diff=38269</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 8</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_8&amp;diff=38269"/>
		<updated>2015-10-22T19:44:14Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 8=&lt;br /&gt;
&lt;br /&gt;
==Model-View-Controller==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es einen einarmigen Banditen nach dem&lt;br /&gt;
[http://glossar.hs-augsburg.de/Model-View-Controller-Paradigma Model-View-Controller-Paradigma] zu programmieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie einen neuen Ordner namens &amp;quot;aufgabe8&amp;quot; innerhalb Ihres Verzeichnis für die Praktikumsaufgaben.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Lehveranstaltungsordner &amp;quot;aufgabe8/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Die Vorlage enthält die Verzeichnisstruktur, die fertige HTML-Datei, die &amp;quot;EventDispatcher&amp;quot;-Klasse und die fertige Hauptdatei.&lt;br /&gt;
Es gilt den gesamten Code für das Model, die View und den Controller zu entwickeln.&lt;br /&gt;
&lt;br /&gt;
Nutzen Sie die Code-Beispiele in den folgende Abschnitten um zu überprüfen ob Ihre Implementierungen korrekt sind.&lt;br /&gt;
Untersuchen Sie außerdem die Beispiele aus der Vorlesung unter &amp;quot;aufgabe8/beispiele&amp;quot; falls Sie nicht weiterkommen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Model===&lt;br /&gt;
&lt;br /&gt;
Das Modell des einarmigen Banditen setzt sich aus den beiden Komponenten &amp;quot;Slot&amp;quot; und &amp;quot;SlotMachine&amp;quot; zusammen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Lassen Sie die Event-Kommunikation und die asynchrone Funktionsweise im ersten Schritt der Implementierung aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Slot====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Slot&amp;quot; repräsentiert ein Feld welches eine Menge an möglichen Werten vorhält und stets einen dieser Werte annimmt.&lt;br /&gt;
Die Menge an möglichen Werten wird bei der Erzeugung eines Felds als Argument an den Konstruktor übergeben.&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;quot;spin()&amp;quot; wird das Feld &#039;&#039;&#039;asynchron&#039;&#039;&#039; zufällig oft gedreht und nimmt immer wieder einen zufälligen Wert an.&lt;br /&gt;
Nutzen Sie einen JavaScript-Timer (z.B. &amp;lt;code&amp;gt;setTimeout&amp;lt;/code&amp;gt;) um das wiederholte asynchrone Drehen zu implementieren.&lt;br /&gt;
&lt;br /&gt;
Bei jeder Drehung des Felds wird das Ereignis &amp;quot;spin&amp;quot; erzeugt.&lt;br /&gt;
Wenn das Feld aufhört sich zu drehen wird das Ereignis &amp;quot;stop&amp;quot; erzeugt.&lt;br /&gt;
Als Daten für die beiden Ereignisse wird der jeweils aktuell angenommene Wert des Feldes mit übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
- Nutzen Sie die Hilfsklasse &amp;quot;EventDispatcher&amp;quot; aus der Vorlage für die Event-Kommunikation.&lt;br /&gt;
- Nutzen Sie &amp;lt;code&amp;gt;Math.random()&amp;lt;/code&amp;gt; um einen zufälligen Wert zu erzeugen oder zufällig eine Entscheidung zu treffen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte dann ein Feld erzeugen und zufällig häufig den neuen Wert ausgeben und abschließend einmal den finalen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var slot = new Slot([&#039;red&#039;, &#039;green&#039;, &#039;blue&#039;]);&lt;br /&gt;
slot.eventDispatcher.addEventListener(&#039;spin&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Neuer Wert: &#039; + event.detail);&lt;br /&gt;
});&lt;br /&gt;
slot.eventDispatcher.addEventListener(&#039;stop&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Finaler Wert: &#039; + event.detail);&lt;br /&gt;
});&lt;br /&gt;
slot.spin();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SlotMachine====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;SlotMachine&amp;quot; repräsentiert eine Sammlung einer variablen Anzahl an Feldern und einer Menge an möglichen Werten für diese.&lt;br /&gt;
Die Anzahl der Felder und die Menge der möglichen Werte werden bei der Erzeugung als Argument an den Konstruktor übergeben.&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;SlotMachine&amp;quot; erzeugt anhand der gegebenen Anzahl automatisch die einzelnen Felder und verwaltet diese intern.&lt;br /&gt;
Mithilfe der Funktion &amp;quot;spin()&amp;quot; wird die Funktion &amp;quot;spin()&amp;quot; von jedem in der Sammlung enthaltenen Feld augerufen.&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;SlotMachine&amp;quot; hört auf jedes &amp;quot;spin&amp;quot;-Ereignis der Felder und erzeugt selbst daraufhin ein eigenes &amp;quot;spin&amp;quot;-Ereignis.&lt;br /&gt;
Haben alle enhtaltenen Felder das &amp;quot;stop&amp;quot;-Ereignis erzeugt, erzeugt die &amp;quot;SlotMachine&amp;quot; ebenso ein finales &amp;quot;stop&amp;quot;-Ereignis.&lt;br /&gt;
Die beiden Ereignisse übergeben als Daten jeweils alle aktuellen Werte der enthaltenen Felder als Liste.&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte drei Felder erzeugen und für jede Drehung jedes Felds und einmal abschließend alle Werte ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var slotMachine = new SlotMachine(3, [&#039;red&#039;, &#039;green&#039;, &#039;blue&#039;]);&lt;br /&gt;
slotMachine.eventDispatcher.addEventListener(&#039;spin&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Neue Werte: &#039; + event.detail);&lt;br /&gt;
});&lt;br /&gt;
slotMachine.eventDispatcher.addEventListener(&#039;stop&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Finale Werte: &#039; + event.detail);&lt;br /&gt;
});&lt;br /&gt;
slotMachine.spin();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===View===&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, dass Sie in den folgenden Abschnitten die SVG-API nutzen um die Views zu implementieren.&lt;br /&gt;
Möchten Sie DOM nutzen müssen Sie die &amp;quot;index.js&amp;quot; geringfügig ändern und die Views entsprechend anders benennen.&lt;br /&gt;
Analog zu dem Modell besteht die View des einarmigen Banditen aus den zwei Komponenten &amp;quot;SlotSVGView&amp;quot; und &amp;quot;SlotMachineSVGView&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SlotSVGView====&lt;br /&gt;
&lt;br /&gt;
Eine &amp;quot;SlotSVGView&amp;quot; erzeugt für ein Feld ein rechteckige Repräsentation welche bei jedem neu angenommenen Wert die Farbe wechselt.&lt;br /&gt;
Das bedeutet, dass solch eine View die beiden Ereignisse &amp;quot;spin&amp;quot; und &amp;quot;stop&amp;quot; verarbeiten und entsprechend anzeigen muss.&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte für ein Feld ein Rectheck erzeugen welches beim Drehen des Felds zufällig oft seine Farbe wechselt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var slot = new Slot([&#039;red&#039;, &#039;green&#039;, &#039;blue&#039;]);&lt;br /&gt;
var slotView = new SlotSVGView(slot);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(slotView);&lt;br /&gt;
slot.spin();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Nutzen Sie Namen von Farben wie zum Beispiel &amp;quot;black&amp;quot; als mögliche Werte für Felder um das Rendering zu vereinfachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SlotMachineSVGView====&lt;br /&gt;
&lt;br /&gt;
Eine &amp;quot;SlotMachineSVGView&amp;quot; ist das View-Gegenstück zu einer &amp;quot;SlotMachine&amp;quot;, d.h. sie visualisiert eine Sammlung von Feldern.&lt;br /&gt;
Bei der Erzeugung einer solchen View wird für jedes darzustellende Feld eine eigene &amp;quot;SlotMachineSVGView&amp;quot; erzeugt.&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte für eine Sammlung von drei Feldern drei Rechtecke darstellen, welche Ihre Farbe wechseln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var slotMachine = new SlotMachine(3, [&#039;red&#039;, &#039;green&#039;, &#039;blue&#039;]);&lt;br /&gt;
var slotMachineView = new SlotMachineSVGView(slotMachine);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(slotView);&lt;br /&gt;
slotMachine.spin();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controller===&lt;br /&gt;
&lt;br /&gt;
Der Controller-Teil besteht aus der Komponente &amp;quot;SlotMachineController&amp;quot;, welche lediglich das Model kennen muss.&lt;br /&gt;
&lt;br /&gt;
Bei einem &amp;quot;click&amp;quot;-Ereignis auf dem Button mit der ID &amp;quot;spin-button&amp;quot; wird &amp;quot;spin()&amp;quot; auf der &amp;quot;SlotMachine&amp;quot; aufgerufen.&lt;br /&gt;
Mithilfe von &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt; wird dem Attribut &amp;quot;disabled&amp;quot; auf dem Button der Wert &amp;quot;disabled&amp;quot; zugewiesen.&lt;br /&gt;
Auf diese Weise wird der Button deaktiviert und kann nicht nochmal gedrückt werden, solange sich die Felder drehen.&lt;br /&gt;
Außerdem wird dem Attribut &amp;quot;innerHTML&amp;quot; auf dem Element mit der ID &amp;quot;result-text&amp;quot; der Text &amp;quot;Drehen...&amp;quot; zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Sobald die &amp;quot;SlotMachine&amp;quot; das &amp;quot;stop&amp;quot;-Ereignis erzeugt, überprüft der Controller ob der Spieler das Spiel gewonnen hat.&lt;br /&gt;
Sind alle Felder wertegleich wird dem &amp;quot;innerHTML&amp;quot; des Elements mit der ID &amp;quot;result-text&amp;quot; der Wert &amp;quot;Gewonnen!&amp;quot; zugewiesen.&lt;br /&gt;
Ist dies nicht der Fall wird der Wert &amp;quot;Verloren!&amp;quot; zugewiesen, um zu signalisieren, dass der Spieler verloren hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Spiel testen===&lt;br /&gt;
&lt;br /&gt;
Wurde alles korrekt implementiert, können Sie nun den einarmigen Banditen benutzen.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38268</id>
		<title>JavaScript-Tutorium:Browser</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38268"/>
		<updated>2015-10-22T19:16:04Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Timer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten bei der JavaScript-Entwicklung im Browser zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Einführung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Native vs. Host==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer JavaScript-Umgebung existieren zwei Arten von Objekte.&lt;br /&gt;
&#039;&#039;&#039;Native Objekte&#039;&#039;&#039; werden von der Engine bereitgestellt und sind durch den ECMAScript-Standard abgedeckt.&lt;br /&gt;
&#039;&#039;&#039;Host-Objekte&#039;&#039;&#039; sind nicht immer standardisiert und werden von der Umgebung bereitgestellt.&lt;br /&gt;
Im Browser handelt es sich bei Host-Objekten um Schnittstellen für den Zugriff auf den Browser und externe Geräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==HTML5-Standard==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Obwohl es den ECMAScript-Standard gibt, muss man davon ausgehen,&lt;br /&gt;
dass sich die verfügbaren APIs von Browser zu Browser unterscheiden können.&lt;br /&gt;
Durch die steigende Entwicklungsgeschwindigkeit der Browser-Hersteller und den&lt;br /&gt;
[https://html.spec.whatwg.org/multipage/ HTML5-Standard] verbessert sich diese Situation.&lt;br /&gt;
&lt;br /&gt;
Heutzutage kann man davon ausgehen, dass jeweils die neuesten Versionen von Firefox und Chrome&lt;br /&gt;
die DOM-API und viele der neu verfassten HTML5-APIs bereits standardkonform unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inline Code vs. externe Dateien==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine im Browser angezeigte Web-Seite besteht meist aus HTML, CSS und JavaScript, wobei nur HTML zwingend verlangt ist.&lt;br /&gt;
Der JavaScript-Code kümmert sich normalerweise um die dynamischen Aspekte, wie Interaktionen und das Nachladen von Inhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Browser lädt ein HTML-Dokument unter der angegebenen URL herunter und evaluiert dieses.&lt;br /&gt;
Das Dokument enthält optional Verweise auf CSS-Dateien, Bilder, JavaScript-Dateien und andere Medien.&lt;br /&gt;
Neben Verweisen auf externen JavaScript-Code kann das Dokument auch Inline-Code enthalten.&lt;br /&gt;
Ob es sich um externe Dateien oder Inline-Code handelt wirkt sich auf die Ladezeiten aus,&lt;br /&gt;
der Code selbst wird davon nicht beeinflusst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Reihenfolge der eingebunden Code-Blöcke und angegebenen Dateiverweise ist wichtig,&lt;br /&gt;
da diese ebenso die Reihenfolge der Code-Ausführung darstellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Kontext==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für jede Web-Seite, unabhängig davon ob sie im separaten Fenster oder als Tab angezeigt wird,&lt;br /&gt;
erzeugt der Browser einen separaten isolierten JavaScript-Kontext, in dem Code ausgeführt wird.&lt;br /&gt;
Das bedeutet, dass alle Objekte und Funktionen nur so lange existieren bis die Seite neu geladen oder verlassen wird.&lt;br /&gt;
Ein Zugriff auf andere Seiten ist aus Sicherheitsgründen nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
=Window=&lt;br /&gt;
&lt;br /&gt;
Das globale Objekt &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; referenziert alle im Browser verfügbaren Objekte und Werte als Eigenschaften (native und host).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.Object);&lt;br /&gt;
console.log(window.XMLHttpRequest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf globale Eigenschaften ist es nicht notwendig explizit &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; zu schreiben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Date == window.Date);&lt;br /&gt;
console.log(new Date());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht innerhalb von Funktionen deklarierten Variablen werden automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var globaleVariable = &#039;global&#039;;&lt;br /&gt;
var globaleFunktion = function() {};&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
console.log(window.globaleFunktion);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modifikation von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Da es sich um ein normales Objekt handelt können die meisten Eigenschaften modifiziert und auch gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Veränderungen von globalen Eigenschaften sind nicht sinnvoll und können schwerwiegende Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.Object = {};&lt;br /&gt;
var objekt = new Object();&lt;br /&gt;
&lt;br /&gt;
delete window.Array;&lt;br /&gt;
var array = new Array();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt wird vom Browser mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; erzeugt, welche auch global verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.constructor == window.Window);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Popups und Frames==&lt;br /&gt;
&lt;br /&gt;
Neben dem globalen Fenster-Objekt kann eine Web-Seite beliebig viele weitere &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekte enthalten.&lt;br /&gt;
Dabei handelt es sich dann entweder um durch Code erzeugte Popups oder aber um Frames (besser bekannt als iframes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.open(&#039;https://www.google.com&#039;, &#039;Google im Popup&#039;, &#039;width=400,height=300,resizable=yes&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frames können entweder durch das entsprechende HTML oder aber auch wie im Code gezeigt programmatisch erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
==Browser-Schnittstellen==&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den nativen Objekten notwendigen Objekte enthält &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; wichtige Browser- und Geräte-Schinttstellen.&lt;br /&gt;
Dazu zählen zum Beispiel Funktionen um Dialoge im Browser zu öffnen oder aber sogar um Game-Controller zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = window.prompt(&#039;Wie ist Ihr Name?&#039;);&lt;br /&gt;
window.alert(&#039;Hello &#039; + name);&lt;br /&gt;
window.alert(&#039;Die aktuelle Seite ist &#039; + window.innerWidth + &#039;px breit&#039;);&lt;br /&gt;
&lt;br /&gt;
console.log(window.Gamepad);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Liste der verfügbaren Eigenschaften finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/de/docs/DOM/window dieser] MDN-Seite.&lt;br /&gt;
In den folgenden Abschnitten werden exemplarisch ein paar wichtige Objekte im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Beispiel für Browser-Schnittstellen=&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; ist ein globales Objekt welches die aktuelle URL und ihre Bestandteile enthält und diese auch verändern kann.&lt;br /&gt;
Das Objekt wird analog zum &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt; erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.location.constructor == window.Location);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen der URL===&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; enhtält die gesamte aktuelle URL. Alternativ kann auch &amp;lt;code&amp;gt;location.toString()&amp;lt;/code&amp;gt; genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.href);&lt;br /&gt;
console.log(location.toString());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einzelne Bestandteile der URL ermitteln zu können werden viele separate Eigenschaften bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.protocol);&lt;br /&gt;
console.log(location.host);&lt;br /&gt;
console.log(location.port);&lt;br /&gt;
console.log(location.pathname);&lt;br /&gt;
console.log(location.hash);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verändern der URL===&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften können nicht nur lesend genutzt werden, sondern auch um Änderungen an der aktuellen URL vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Mit der Ausname von &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; führen Änderungen der Eigenschaften zum Verlassen der aktuellen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.protocol = &#039;http&#039;;&lt;br /&gt;
location.port = &#039;8080&#039;;&lt;br /&gt;
location.hash = &#039;#anker&#039;;&lt;br /&gt;
location.href = &#039;https://www.google.com&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es ein paar Funktionen um die URL zu modifizieren oder aber die Seite neuzuladen:&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.assign(&#039;https://www.google.com&#039;);&lt;br /&gt;
location.reload(true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
Das globale &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt;-Objekt ermöglicht den programmatischen Zugriff auf den Browser-Verlauf.&lt;br /&gt;
Es werden Funktionen zur Verfügung gestellt um im Verlauf beliebig viele Schritte zurück und vorwärts zu gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
history.back();&lt;br /&gt;
history.forward();&lt;br /&gt;
history.go(-3);&lt;br /&gt;
history.go(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Aus Sicherheitsgründen ist es nicht erlaubt auf Informationen einzelner Einträge im Verlauf zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
==Navigator==&lt;br /&gt;
&lt;br /&gt;
Für detaillierte Informationen über den aktuellen Client bzw. Browser existiert das &amp;lt;code&amp;gt;navigator&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
Die meistgenutzte Eigenschaft &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; ermöglicht das Feststellen des Browser-Herstellers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(navigator.userAgent);&lt;br /&gt;
console.log(navigator.battery);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Document Object Model=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt können beliebig viele Dokumentenobjekte zugeordnet werden, mindestens aber ein Hauptdokument.&lt;br /&gt;
Das Hauptdokument wird über die globale Variable &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; zur Verfügung gestellt.&lt;br /&gt;
Die Schnittstelle für den Dokumentenzugriff wird durch das [http://www.w3.org/DOM/ Document Object Model] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektmodell==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekt repräsentiert ein vom Browser interpretiertes HTML-Dokument als Objektmodell mit einer Baumstruktur.&lt;br /&gt;
Dabei werden Tags, Texte und Kommentare in Knoten umgewandelt, wobei Tag-Knoten wiederum Unterknoten haben können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
      Text&lt;br /&gt;
      &amp;lt;!-- Kommentar --&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Eingabe&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Markup wird in folgendes Objektmodell übersetzt:&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;html&#039;&#039;&#039;-Knoten mit den Unterknoten &#039;&#039;&#039;head&#039;&#039;&#039; und &#039;&#039;&#039;body&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;head&#039;&#039;&#039;-Knoten mit dem Unterknoten &#039;&#039;&#039;title&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;title&#039;&#039;&#039;-Knoten mit einem Text-Unterknoten&lt;br /&gt;
* Ein &#039;&#039;&#039;body&#039;&#039;&#039;-Knoten mit den Unterknoten &#039;&#039;&#039;p&#039;&#039;&#039; und &#039;&#039;&#039;input&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;p&#039;&#039;&#039;-Knoten mit einem Text- und einem Kommentar-Unterknoten&lt;br /&gt;
* Ein &#039;&#039;&#039;input&#039;&#039;&#039;-Knoten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Achtet man bei HTML auf eine korrekte Einrückung so ist das resultierende Objektmodell meist gut erkennbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Markup-Korrekturen===&lt;br /&gt;
&lt;br /&gt;
Bei dem Objektmodell handelt es sich &#039;&#039;&#039;nicht&#039;&#039;&#039; um exaktes Abbild des originalen Markups.&lt;br /&gt;
Der Unterschied wird klar, wenn man das Resultat von invalidem HTML untersucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Tabelle&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Browser fügt zwischen dem &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;- und dem &amp;lt;code&amp;gt;tr&amp;lt;/code&amp;gt;-Knoten einen &amp;lt;code&amp;gt;tbody&amp;lt;/code&amp;gt;-Knoten ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau von Dokumenten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Node-Objekte===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Knoten innerhalb eines Dokumentenobjekts ist direkt oder indirekt abgeleitet vom &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Konstruktor/-Prototypen.&lt;br /&gt;
Mit Ausnahme des Dokumentenobjekts selbst wird allen Knoten ein Dokument zugeordnet durch die &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;-Eigenschaft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des Weiteren hat jeder Knoten einen numerischen Typen, der in der Eigenschaft &amp;lt;code&amp;gt;nodeType&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
Die gängisten Typen von Dokumentenknoten sind:&lt;br /&gt;
&lt;br /&gt;
* 1: ELEMENT_NODE&lt;br /&gt;
* 3: TEXT_NODE&lt;br /&gt;
* 8: COMMENT_NODE&lt;br /&gt;
* 9: DOCUMENT_NODE&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Referenz der Eigenschaften von Node-Objekten finden Sie auf&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Web/API/Node dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Document-Objekte===&lt;br /&gt;
&lt;br /&gt;
Das Dokument selbst repräsentiert ein abstraktes Dokument und somit kein HTML-Element.&lt;br /&gt;
Es verweist aber auf das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element mit der Eigenschaft &amp;lt;code&amp;gt;documentElement&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe eines Dokuments ist es möglich neue &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekte zu erstellen, einzufügen und diese zu suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Element-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jedes HTML-Tag wird in einen Knoten übersetzt, welcher mit dem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Konstruktor erzeugt wird.&lt;br /&gt;
Element-Objekte besitzen Schnittstellen um auf Eigenschaften des Tags zuzugreifen und diese zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement.tagName);&lt;br /&gt;
console.log(document.documentElement.innerHTML);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie Dokumente können Element-Objekten weitere Node-Objekte als Unterknoten angehängt und nach ihnen gesucht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neue Element-Objekte werden über die Funktion &amp;lt;code&amp;gt;createElement()&amp;lt;/code&amp;gt; eines &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekts unter Angabe des Tag-Namens erzeugt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
console.log(absatz.tagName);&lt;br /&gt;
console.log(absatz.nodeType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung wird das neue Element dem augerufenen Dokument durch die Eigenschaft &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt; als zugehörig markiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var block = document.createElement(&#039;div&#039;);&lt;br /&gt;
console.log(block.ownerDocument);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da die Schnittstelle eines Dokuments nicht mit HTML-Standards gekoppelt ist, können beliebige Tag-Namen vergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinElement = document.createElement(&#039;mein-element&#039;);&lt;br /&gt;
console.log(meinElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Suchen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig bei der Arbeit mit Dokumenten ist die Suche von einzelnen oder mehreren Elementen.&lt;br /&gt;
Aufgrund dessen haben sich die Schnittstellen für die Suche im Browser über die letzten Jahre rapide verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorgefertige Kriterien===&lt;br /&gt;
&lt;br /&gt;
Die ursprünglichen Funktionen zum Suchen von Elementen erlauben wenige festgelegte Kriterien.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeld = document.getElementById(&#039;spielfeld&#039;);&lt;br /&gt;
console.log(spielfeld);&lt;br /&gt;
&lt;br /&gt;
var divElemente = document.getElementsByTagName(&#039;div&#039;);&lt;br /&gt;
console.log(divElemente);&lt;br /&gt;
&lt;br /&gt;
var gegnerElemente = document.getElementsByClassName(&#039;gegner&#039;);&lt;br /&gt;
console.log(gegnerElemente.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Weise können Elemente anhand der ID, Klasse oder des Tag-Namen gesucht werden.&lt;br /&gt;
Der Rückgabewert ist bei der ID-Suche ein &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Objekt und bei den anderen eine &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt;, ein Array-artiges Objekt von Nodes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CSS-Selektoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Suche mithilfe von vorgefertigen Kriterien hat deutliche Limitierungen.&lt;br /&gt;
Deswegen enstand durch Bibliotheken wie jQuery das Konzept von Query-Selektoren, welche als&lt;br /&gt;
[http://www.w3.org/TR/CSS2/selector.html CSS-Selektoren] standardisiert werden und in vielen Browser verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine CSS-Selektorgruppe beschreibt beliebig viele Kriterien, die auf ein oder mehrere HTML-Elemente zutreffen.&lt;br /&gt;
Der Name wurde so gewählt, da diese ebenso in Stylesheets genutzt werden um Elemente auszuwählen.&lt;br /&gt;
Aufgrund der Kombinierbarkeit von CSS-Selektoren ergibt sich eine sehr mächtige Suchfunktionalität.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Funktionen für die Suche mit CSS-Selektoren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelector()&amp;lt;/code&amp;gt; liefert das erste Element zurück welches die Kriterien erfüllt&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelectorAll()&amp;lt;/code&amp;gt; liefert alle Elemente zurück welche die Kriterien erfüllen in Form einer &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Mögliche Kriterien====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das einfachste Kriterium für einen CSS-Selektor ist die Angabe eines Tag-Namen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.querySelectorAll(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Angabe einer ID eines HTML-Elements erfolgt durch eine vorangestellte Raute (&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeldElement = document.querySelector(&#039;#spielfeld&#039;);&lt;br /&gt;
console.log(spielfeldElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Klassen-Selektoren werden durch einen vorangestellten Punkt (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegnerElemente = document.querySelectorAll(&#039;.gegner&#039;);&lt;br /&gt;
console.log(gegnerElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Mächtigkeit von CSS-Selektoren ergibt sich vor allem durch die beliebige Kombinationsmöglichkeiten von Selektoren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var schwierigeGegnerElemente =&lt;br /&gt;
  document.querySelectorAll(&#039;.gegner.schwierig&#039;);&lt;br /&gt;
console.log(schwierigeGegnerElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 1:&#039;&#039;&#039; Die Komplexität einer CSS-Selektorgruppe beeinflusst die Performance einer Suche.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 2:&#039;&#039;&#039; Eine vollständige Erklärung der Funktionsweise von CSS-Selektoren ist nicht Ziel dieses Tutoriums.&lt;br /&gt;
Diese Einführung dient lediglich dazu ein grundsätzliches Verständnis für den Umgang mit Selektoren zu vermitteln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hinzufügen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neu erstellte Elemente können im Dokument als untergeordnete Knoten mithilfe von &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
document.documentElement.appendChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der künftig übergeordnete Knoten muss angesprochen werden, wenn das Element an einer bestimmten Stelle landen soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.querySelector(&#039;div&#039;);&lt;br /&gt;
var spielfeld = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielfeld.appendChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifizieren von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe der entsprechenden DOM-Schnittstellen können Text, HTML, Attribute sowie das Styling von Elementen beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von Text und HTML===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der gesamte HTML-Inhalt eines Elements kann mithilfe der Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;Hallo Welt&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von einfachen Text-Änderungen lässt sich sogar das gesamte enthaltene HTML beeinflussen.&lt;br /&gt;
Anstatt also mit der DOM-API einzelne Elemente zu erzeugen kann einfach Markup als Wert zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;p&amp;gt;Hallo &amp;lt;strong&amp;gt;Welt!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von Attributen===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die Attribute eines HTML-Elements gibt es die Funktionen &amp;lt;code&amp;gt;getAttribute()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Beide akzeptieren als erstes Argument den Namen des Attributs, der Setter akzeptiert außerdem einen zu setzenden Wert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielerElement.innerHTML = &#039;_|_&#039;;&lt;br /&gt;
spielerElement.setAttribute(&#039;class&#039;, &#039;spieler&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(spielerElement);&lt;br /&gt;
&lt;br /&gt;
console.log(spielerElement.getAttribute(&#039;class&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Besonders häufige Attributsänderungen sind das Hinzufügen und/oder Entfernen von Klassen.&lt;br /&gt;
Dafür gibt es in neueren Browsern die Liste &amp;lt;code&amp;gt;classList&amp;lt;/code&amp;gt; auf jedem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt, welche die Arbeit erleichtert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
spielerElement.classList.add(&#039;unbesiegbar&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von CSS-Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neben dem Document Object Model existiert außerdem der [http://dev.w3.org/csswg/cssom/ CSS Object Model Standard]&lt;br /&gt;
welcher die Schnittstelle für den Zugriff auf CSS-Eigenschaften von DOM-Objekten standardisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein jedes DOM-Element vom Typ &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; besitzt eine Eigenschaft &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; welche alle CSS-Eigenschaften beherbergt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
console.log(body.style.color);&lt;br /&gt;
console.log(body.style.padding);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften spiegeln die in Stylesheets definierten Regeln wieder, jedoch inklusive dem kaskadierenden Charakter.&lt;br /&gt;
Das heisst dass ein Element-Objekt nicht zwingend selbst eine &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; besitzt, diese jedoch für die Anzeige vererbt bekommt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften können ebenso beliebig modifiziert werden, was zu einer sofortigen Anpassung der Darstellung führt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.style.backgroundColor = &#039;#AAF&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie neue Elemente einem Dokument hinzugefügt werden können, so können diese oder bestehende auch gelöscht werden.&lt;br /&gt;
Dazu muss man den übergeordneten Knoten ansteuern und mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt; die Entfernung durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeld = document.querySelector(&#039;.spielfeld&#039;);&lt;br /&gt;
var spielerElement = spielfeld.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
spielfeld.removeChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist einem der übergeordnete Knoten nicht bekannt so kann diesen mithilfe der Knotenverweise ermitteln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var entferneKnoten = function(knoten) {&lt;br /&gt;
  if (!knoten.parentNode) {&lt;br /&gt;
    throw new Error(&#039;no parent node&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  knoten.parentNode.removeChild(knoten);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spielerElement = document.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
entferneKnoten(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=DOM Events=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisorientierte Programmierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für die Verarbeitung von stets verfügbaren Informationen eignet sich ein sequentieller Ablauf von Befehlen.&lt;br /&gt;
Ergeben sich Informationen jedoch dynamisch zur Laufzeit kann die ereignisorientierte Programmierung genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Hierbei wird nicht aktiv auf eine Information gewartet, das Programm wird benachrichtigt wenn ein Ereignis eintritt.&lt;br /&gt;
Somit gibt es nicht nur einen Kontrollfluss, sondern beliebig viele, welche sogar parallel ablaufen können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisse im Browser==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Interaktion mit Websites werden viele Ereignisse ausgelöst.&lt;br /&gt;
Zuerst wird die HTML-Seite geladen und gerendert, danach geschieht dies für alle referenzierten Inhalte.&lt;br /&gt;
Diese Vorgänge lösen Ereignisse aus, welche durch den Browser selbst verursacht werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel gibt es Ereignisse für Medien, welche beschreiben, dass diese fertig geladen wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald der Browser beginnt eine Web-Seite zu rendern können Ereignisse durch den Benutzer ausgelöst werden.&lt;br /&gt;
Fast jede Interaktion löst ein Ereignis aus, welches wiederum in bestimmten Reaktionen resultiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
Klickt der Benutzer einen Link so ist das ein Ereignis, welches zur Folge hat dass die eine URL geladen wird.&lt;br /&gt;
Wird ein Scroll-Balken bewegt ergibt sich daraus ein Ereignis, welches den Browser scrollen lässt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zu den wichtigsten Arten von durch Benutzer ausgelöste Ereignissen zählen:&lt;br /&gt;
Mausbewegungen und -klicks, Tastatureingaben und Scrolling.&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Auflistung von Ereignissen finden Sie auf [https://developer.mozilla.org/en-US/docs/Web/Events dieser] MDN-Seite.&lt;br /&gt;
Nebem dem Benutzer gibt es noch andere Auslöser wie zum Beispiel verbundene Server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau eines Ereignisses==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein im Browser auftretendes Ereignis besitzt immer drei folgende Merkmale:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Name:&#039;&#039;&#039; eine Zeichenkette die das Ereignis in der Gegenwart beschreibt, z.B. &amp;quot;click&amp;quot; oder &amp;quot;mousemove&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Daten:&#039;&#039;&#039; ein Datenobjekt mit einer pro Ereignis festgelegten Struktur&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Ziel:&#039;&#039;&#039; ein Objekt das als Ziel des Ereignis gilt; in der Regel handelt es sich um DOM-Elemente&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine &#039;&#039;&#039;Tastatureingabe&#039;&#039;&#039; in einem &#039;&#039;&#039;Formularfeld&#039;&#039;&#039;, bei dem das Zeichen &#039;&#039;&#039;@&#039;&#039;&#039; eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Phasen der Ereignispropagierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei dem ursprünglichen Ziel eines Ereignisses um ein DOM-Objekt werden in der Regel drei Phasen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Capturing-Phase===&lt;br /&gt;
&lt;br /&gt;
In Phase 1, der &#039;&#039;&#039;Capturing-Phase&#039;&#039;&#039;, wird ein Ereignis mit dem obersten Dokumentenknoten als Ziel ausgelöst.&lt;br /&gt;
Dabei handelt es sich in der Regel um das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt, welches alle andere Nodes als Unterknoten enthält.&lt;br /&gt;
Es werden dann schrittweise Ereignisse ausgelöst für jeden Unterknoten auf dem Pfad zum ursprünglichen Ereignisziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
+ window      - Ereignis mit window als aktuelles Ziel (optional)&lt;br /&gt;
  + document  - Ereignis mit body als aktuelles Ziel&lt;br /&gt;
    + body    - Ereignis mit body als aktuelles Ziel&lt;br /&gt;
      + p     - ursprüngliches Ziel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Bei manchen Ereignissen ist &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; das oberste Objekt in der Hierarchie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Target-Phase===&lt;br /&gt;
&lt;br /&gt;
Ist der Browser beim ursprünglichen Ziel angelangt wird in Phase 2 gewechselt, der sogenannten &#039;&#039;&#039;Target-Phase&#039;&#039;&#039;.&lt;br /&gt;
Dabei wird ein einzelnes Ereignis ausgelöst, für welches das ursprüngliche DOM-Objekt als Ziel verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bubbling-Phase===&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss der Ereignispropagierung wechselt der Browser in Phase 3, der sogenannten &#039;&#039;&#039;Bubbling-Phase&#039;&#039;&#039;.&lt;br /&gt;
Hierbei wird der Pfad der Capturing-Phase in umgekehrter Richtung durchlaufen und jeweils wieder ein Ereignis ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In Bibliotheken wie jQuery hat man nur Zugriff auf die Bubbling-Phase, nicht auf die Capturing-Phase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Browser-Unterschiede===&lt;br /&gt;
&lt;br /&gt;
Capturing und Bubbling bilden die Tatsache ab, dass wenn ein Ereignis auf einem Element stattfindet,&lt;br /&gt;
dieses Ereignis ebenso für die übergeordneten Elemente gültig ist.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wird ein Mensch in einem Krankenhaus geboren, so wird er auch in einer Stadt und in einem Land geboren.&lt;br /&gt;
&lt;br /&gt;
Einer der beiden Phasen wäre ausreichend für die Ereignisvearbeitung.&lt;br /&gt;
Aufgrund von unterschiedlichen Browser-Implementierungen existieren heutzutage jedoch beide gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Globale Ereignisse===&lt;br /&gt;
&lt;br /&gt;
Beschreibt ein Ereignis ein globales Geschehen wird oftmals das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als Ereignisziel verwendet.&lt;br /&gt;
In diesen Fällen ist es möglich dass weder Capturing- noch eine Bubbling-Phase durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Ergeinis &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; beschreibt, dass eine Seite (ohne seine externen Medien) fertig geladen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe der DOM-Schnittstelle erhält man die Möglichkeit Ereignisse selbst zu verarbeiten und darauf zu reagieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anmeldung===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt; kann auf jedem DOM-Objekt, dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt und dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt aufgerufen werden.&lt;br /&gt;
Dabei ist das Objekt auf dem die Funktion aufgerufen das &#039;&#039;&#039;Ziel&#039;&#039;&#039; des Ereignisses, welches verarbeiten werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion akzeptiert die folgenden drei Argumente:&lt;br /&gt;
* den &#039;&#039;&#039;Namen des Ereignisses&#039;&#039;&#039; das man verarbeiten möchte in Form eines Strings&lt;br /&gt;
* die &#039;&#039;&#039;Callback-Funktion&#039;&#039;&#039; welche das Ereignis-Objekt erwartet und den Code zur Verarbeitung enthält&lt;br /&gt;
* ein optionales &#039;&#039;&#039;Flag&#039;&#039;&#039; das bestimmt ob das Ereignis in der Capturing- oder Bubbling-Phase verarbeitet werden soll&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist das Flag &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, was bedeutet dass das Ereignis in der Bubbling-Phase verarbeitet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es wird für ein Ereignis auf einem Ziel ein Event-Lister in Form einer Funktion angemeldet.&lt;br /&gt;
Beim Eintreten des Ereignisses wird der sogenannte Callback aufgerufen und das entsprechende Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var seiteWurdeGeladen = function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite ist nun fertig geladen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
}&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, seiteWurdeGeladen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;a id=&amp;quot;link&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
var link = document.querySelector(&#039;#link&#039;);&lt;br /&gt;
var linkWurdeGeklickt = function(event) {&lt;br /&gt;
  console.log(&#039;Der Link wurde geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
link.addEventListener(&#039;click&#039;, linkWurdeGeklickt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Phasen der Ereignispropagierung kann man Ereignisse global verarbeiten, unabhängig davon wo sie stattgefunden haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
var irgendwoWurdeGeklickt = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat irgendwo auf der Seite geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;click&#039;, irgendwoWurdeGeklickt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Callback ist eine Rückruffunktion, welche an ein andere Funktion übergeben wird und&lt;br /&gt;
zu späteren Zeitpunkten ggf. ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mausWurdeBewegt = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist jedoch nicht garantiert dass eine übergebene Callback-Funktion überhaupt jemals ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var esIstOktober = function(event) {&lt;br /&gt;
  console.log(&#039;Es ist Oktober&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var istEsOktober = function(callback) {&lt;br /&gt;
  if (new Date().getMonth() == 9) callback();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
istEsOktober(esIstOktober);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ereignis-Objekte===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedem Event-Listener-Callback wird beim Aufruf ein für ein Ereignis spezifisches Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
  console.log(event.screenX);&lt;br /&gt;
  console.log(event.screenY);&lt;br /&gt;
  console.log(event.button);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieses Objekt enthält neben spezifischen auch generelle Ereignisinformationen wie zum Beispiel das Ereignis-Ziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich der drei Event-Phasen unterscheidet man zwischen ursprünglichem und aktuellem Ziel.&lt;br /&gt;
Das aktuelle Ziel ist das für welches das Ereignis aktuell gilt und das ursprüngliche das wo es stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target); // ursprüngliches Ziel&lt;br /&gt;
  console.log(event.currentTarget); // aktuelles Ziel&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Ziel &amp;lt;code&amp;gt;currentTarget&amp;lt;/code&amp;gt; entspricht also immer dem Objekt auf dem man den Event-Handler angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abmeldung===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;removeEventListener&amp;lt;/code&amp;gt; kann ein angemeldeter Event-Listener wieder entfernt werden.&lt;br /&gt;
Diese Funktion nur zwei Argumente: Den Ereignis-Namen und die Event-Listener-Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mausWurdeBewegt = function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
document.removeEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Standardverhalten===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nachdem alle Ereignisse verarbeitet wurden führt der Browser gegegebenfalls eine &amp;quot;Default Action&amp;quot; aus.&lt;br /&gt;
Eine solche Aktion ist das Standardverhalten des Browsers als Reaktion auf das eingetretene Ereignis.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Benutzer klickt auf einen Link -&amp;gt; der Browser lädt die URL&lt;br /&gt;
* Benutzer führt Tastatureingaben in einem Feld aus -&amp;gt; der Browser fügt die Zeichen dem Feld hinzu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Event-Listener-Funktion ist es möglich mithilfe von &amp;lt;code&amp;gt;preventDefault()&amp;lt;/code&amp;gt; das Standardverhalten zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
      event.preventDefault();&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben dargestellte Code führt dazu, dass kein Klick auf einen Link die enthaltene URL aufruft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wichtige Events==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse sind die wichtigsten in der täglichen browser-seitingen Anwendungsentwicklung mit JavaScript.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===DOMContentLoaded===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis beschreibt, dass das HTML geladen und interpretiert wurde und das DOM und CSSOM erzeugt und gerendert wurde.&lt;br /&gt;
Es wird keine Aussage darüber gemacht ob weitere externe Inhalte bereits geladen wurden, wie z.B. Bilder.&lt;br /&gt;
Das Ereignis wird ausschliesslich auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt als Ereignisziel ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Mit der Seite kann interagiert werden&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===load===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis besagt, dass die gesamte Web-Seite inklusive aller externen referenziereten Inhalte gerendert wurden.&lt;br /&gt;
Im Gegensatz zu &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; wird dieses Ereignis ausschliesslich auf dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&#039;load&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite wurde vollständig geladen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===click===&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn der Benutzer (mit der Maus) auf ein sichtbares DOM-Element klickt wird dieses Ereignis ausgelöst.&lt;br /&gt;
Bei der Propagierung dieses Ereignisses werden wie alle drei Ereignisphasen (Capturing, Bubbling, Target) durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat auf etwas geklickt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===mousemove, mouseover, mouseout===&lt;br /&gt;
&lt;br /&gt;
Bei Mausbewegungen über DOM-Element wird konstant das Ereignis &amp;lt;code&amp;gt;mousemove&amp;lt;/code&amp;gt; mit den entsprechenden Koordinaten ausgelöst.&lt;br /&gt;
Das Ereignis &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt; wird erzeugt wenn die Maus in ein Element eindringt, &amp;lt;code&amp;gt;mouseout&amp;lt;/code&amp;gt; wenn es wieder verlassen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseover&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus über etwas bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseout&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus von etwas weg bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===keydown, keyup, keypress===&lt;br /&gt;
&lt;br /&gt;
Bei Tastatureingaben durch Benutzer auf einem Element werden die Ereignisse &amp;lt;code&amp;gt;keydown&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;keypress&amp;lt;/code&amp;gt; ausgelöst.&lt;br /&gt;
Die drei unterschiedlichen Ereignisse beschreiben die unterschiedlichen Phasen einer Tastatureingabe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;keydown&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste gedrückt&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keypress&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste betätigt&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keyup&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste losgelassen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von DOM Events kann auch ein genereller Event-Mechanismus für JavaScript implementiert werden.&lt;br /&gt;
Dazu wird ein DOM-Element erzeugt, welches als virtuelles Ereignisziel dient und nicht ins Dokument eingehängt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var EventDispatcher = function() {&lt;br /&gt;
&lt;br /&gt;
  var target = document.createElement(&#039;div&#039;);&lt;br /&gt;
&lt;br /&gt;
  this.addEventListener = function(type, callback) {&lt;br /&gt;
    target.addEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.dispatchEvent = function(type, detail) {&lt;br /&gt;
    var event = new CustomEvent(type, {&lt;br /&gt;
      bubbles: true,&lt;br /&gt;
      canceable: true,&lt;br /&gt;
      detail: detail&lt;br /&gt;
    });&lt;br /&gt;
    target.dispatchEvent(event);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.removeEventListener = function(type, callback) {&lt;br /&gt;
    target.removeEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Klasse kann dann in beliebigen anderen Komponenten dazu genutzt werden um Ereignisse zu erzeugen und zu propagieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.eventDispatcher = new EventDispatcher();&lt;br /&gt;
&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    this.eventDispatcher.dispatchEvent(&#039;springen&#039;, this);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.wennSpielerSpringt = function(callback) {&lt;br /&gt;
    this.eventDispatcher.addEventListener(&#039;springen&#039;, callback);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler.wennSpielerSpringt(function() {&lt;br /&gt;
  console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
});&lt;br /&gt;
spieler.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Timer=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Thread==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Browser stellt für jede Web-Seite einen einzelnen Thread zur Verfügung.&lt;br /&gt;
Dieser kümmert sich um das Rendering, die Event-Verarbeitung und die Ausführung von JavaScript.&lt;br /&gt;
Mit Ausnahme des HTML5-Standards der WebWorker gibt es in JavaScript kein Multithreading.&lt;br /&gt;
&lt;br /&gt;
Es ist demnach wichtig, diesen Thread durch Ausführung von Code nicht zu lange zu blockieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Intern bestitzt der Thread eine Liste an Aufgaben die als nächstes ausgeführt werden, der sogenannten Queue.&lt;br /&gt;
Wird eine Web-Seite zum ersten Mal geladen führt dies gleich zu mehreren Einträge in der Queue, wie zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
* Parsen des Markups und Aufbau des DOMs&lt;br /&gt;
* Parsen des CSS und Aufbau des CSSOMs&lt;br /&gt;
* Rendering der Seite&lt;br /&gt;
* Ausführung von geladenem JavaScript-Code&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Manche Aufgaben benötigen unter Umständen viel Zeit und können die Ausführung anderer Aufgaben beeinflussen.&lt;br /&gt;
Nimmt ein Stück Code die CPU zu lange in Anspruch kann der Browser z.B. keine Benutzereingaben mehr vearbeiten.&lt;br /&gt;
Um dies zu vermeiden ist im Browser ein Code-Limit für JavaScript eingebaut, bei dem der Browser eine Warnung ausgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var wartezeitInMs = 5000;&lt;br /&gt;
while (new Date() - programmStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Timeouts==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;setTimeout(callback, delayMs)&amp;lt;/code&amp;gt; kann ein einmalig auszuführenden Timer auf der Thread-Queue angemeldet werden.&lt;br /&gt;
Die übergebene Callback-Funktion wird &#039;&#039;&#039;ungefähr&#039;&#039;&#039; nach einer Wartezeit mit Länge der übergebenen Dauer ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der vielen Aufgaben des Threads kann die Wartezeit überschritten werden, wenn andere Aufgaben viel Zeit beanspruchen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 500);&lt;br /&gt;
while (new Date() - programmStart &amp;lt; 1000) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Wartezeit von 0 Millisekunden heißt, dass der Callback so bald wie möglich ausgeführt werden soll.&lt;br /&gt;
Abhängig von der Browser-Implementierung kann es sein, dass die Wartezeit aber mindestens 15 Millisekunden beträgt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist möglich mit Timern CPU-intensive Aufgaben in mehrere Teile zu spalten oder auch Aufgaben wiederholt auszuführen.&lt;br /&gt;
Dazu erzeugt man einfach eine Funktion welche sich wiederum selbst durch einen &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt;-Aufruf als Timer registriert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durch den Aufruf von &amp;lt;code&amp;gt;clearTimeout(timeoutId)&amp;lt;/code&amp;gt; kann ein noch nicht ausgeführter Timer abgemeldet werden.&lt;br /&gt;
Dabei wird der Eintrag mit gegebener Timeout-ID aus der Thread-Queue gelöscht.&lt;br /&gt;
Die Timeout-ID wird durch &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; als numerischer Rückgabewert bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var timeoutId = null;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  timeoutId = setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearTimeout(timeoutId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; eignet sich vor allem für wiederholende Aufgaben welche nichts mit Rendering zu tun haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Intervalle==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für wiederholt auszuführenden Timer existiert die Funktion &amp;lt;code&amp;gt;setInterval(callback, delayMs)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Als Argumente werden ein Callback und eine Wartezeit zwischen den einzelnen Ausführungen des Callbacks akzeptiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; wird eine ID zurückgegeben, welche für die Abmeldung durch &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
var intervalId = setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearInterval(intervalId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;setInterval()&amp;lt;/code&amp;gt; wirkt komfortabler verglichen mit &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Der Nachteil ist, dass die Messung der Wartezeit vor der Callback-Ausführung beginnt.&lt;br /&gt;
Dauert eine Aufgabe zu lange wird der Thread sehr stark beansprucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var warteEineBestimmeZeit = function() {&lt;br /&gt;
  var funktionsStart = new Date();&lt;br /&gt;
  var wartezeitInMs = 50;&lt;br /&gt;
  while (new Date() - funktionsStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
    // nichts tun&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
setInterval(warteEineBestimmeZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obwohl der CPU noch Zeit zur Verfügung steht, ist sie fast nur damit beschäftigt überfällige Callbacks auszuführen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; &amp;lt;code&amp;gt;setInterval()&amp;lt;/code&amp;gt; eignet sich für wiederholende Aufgaben deren Dauer nicht exakt vorhersehbar ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der verschiedenen Aufgaben des JavaScript-Threads ist eine exakte Wartezeit nicht garantiert.&lt;br /&gt;
Sollen sich Werte exakt zeitabhängig verändern können Datum-Objekte in die Berechnungen mit einbezogen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {position: 0, geschwindigkeitProSekunde: 1};&lt;br /&gt;
var letzterTimerAufruf = new Date();&lt;br /&gt;
var bewegeSpieler = function() {&lt;br /&gt;
  var vergangeneZeitInMs = new Date() - letzterTimerAufruf;&lt;br /&gt;
  spieler.position += geschwindigkeitProSekunde * (vergangeneZeitInMs / 1000);&lt;br /&gt;
  console.log(&#039;Aktuelle Position: &#039; + spieler.position);&lt;br /&gt;
  letzterTimerAufruf = new Date();&lt;br /&gt;
  setTimeout(bewegeSpieler, 1000);&lt;br /&gt;
};&lt;br /&gt;
bewegeSpieler();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Frames==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; ist es möglich Animationen zu implementieren.&lt;br /&gt;
Dazu werden im Callback die gewünschten Elemente in ihrer Form und Position verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielerElement.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; &#039; +&lt;br /&gt;
  &#039;background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(spielerElement);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeSpieler = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  spielerElement.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  setTimeout(bewegeSpieler, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeSpieler();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird versucht das Rechteck ca. 60 Mal pro Sekunde zu bewegen.&lt;br /&gt;
Es kann aber vorkommen, dass der Browser zu stark beansprucht ist und diese Frequenz nicht eingehalten wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für Animationen und visuelle Änderungen die Funktion &amp;lt;code&amp;gt;requestAnimationFrame(callback)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese erwartet nur einen Callback und kümmert sich intern darum wann der Callback das nächste Mal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielerElement.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; &#039; +&lt;br /&gt;
  &#039;background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(spielerElement);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var frameId = null;&lt;br /&gt;
var bewegeSpieler = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  spielerElement.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  frameId = requestAnimationFrame(bewegeSpieler);&lt;br /&gt;
};&lt;br /&gt;
bewegeSpieler();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;clearTimeout()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; gibt es die Funktion &amp;lt;code&amp;gt;cancelAnimationFrame(frameId)&amp;lt;/code&amp;gt; für die Abmeldung.&lt;br /&gt;
Diese akzeptiert eine Frame-ID welche wiederum von &amp;lt;code&amp;gt;requestAnimationFrame()&amp;lt;/code&amp;gt; zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Es ist empfehlenswert Animationen und visuelle Änderungen mit &amp;lt;code&amp;gt;requestAnimationFrame()&amp;lt;/code&amp;gt; zu implementieren.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38267</id>
		<title>JavaScript-Tutorium:Browser</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38267"/>
		<updated>2015-10-22T19:13:22Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten bei der JavaScript-Entwicklung im Browser zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Einführung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Native vs. Host==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer JavaScript-Umgebung existieren zwei Arten von Objekte.&lt;br /&gt;
&#039;&#039;&#039;Native Objekte&#039;&#039;&#039; werden von der Engine bereitgestellt und sind durch den ECMAScript-Standard abgedeckt.&lt;br /&gt;
&#039;&#039;&#039;Host-Objekte&#039;&#039;&#039; sind nicht immer standardisiert und werden von der Umgebung bereitgestellt.&lt;br /&gt;
Im Browser handelt es sich bei Host-Objekten um Schnittstellen für den Zugriff auf den Browser und externe Geräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==HTML5-Standard==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Obwohl es den ECMAScript-Standard gibt, muss man davon ausgehen,&lt;br /&gt;
dass sich die verfügbaren APIs von Browser zu Browser unterscheiden können.&lt;br /&gt;
Durch die steigende Entwicklungsgeschwindigkeit der Browser-Hersteller und den&lt;br /&gt;
[https://html.spec.whatwg.org/multipage/ HTML5-Standard] verbessert sich diese Situation.&lt;br /&gt;
&lt;br /&gt;
Heutzutage kann man davon ausgehen, dass jeweils die neuesten Versionen von Firefox und Chrome&lt;br /&gt;
die DOM-API und viele der neu verfassten HTML5-APIs bereits standardkonform unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inline Code vs. externe Dateien==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine im Browser angezeigte Web-Seite besteht meist aus HTML, CSS und JavaScript, wobei nur HTML zwingend verlangt ist.&lt;br /&gt;
Der JavaScript-Code kümmert sich normalerweise um die dynamischen Aspekte, wie Interaktionen und das Nachladen von Inhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Browser lädt ein HTML-Dokument unter der angegebenen URL herunter und evaluiert dieses.&lt;br /&gt;
Das Dokument enthält optional Verweise auf CSS-Dateien, Bilder, JavaScript-Dateien und andere Medien.&lt;br /&gt;
Neben Verweisen auf externen JavaScript-Code kann das Dokument auch Inline-Code enthalten.&lt;br /&gt;
Ob es sich um externe Dateien oder Inline-Code handelt wirkt sich auf die Ladezeiten aus,&lt;br /&gt;
der Code selbst wird davon nicht beeinflusst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Reihenfolge der eingebunden Code-Blöcke und angegebenen Dateiverweise ist wichtig,&lt;br /&gt;
da diese ebenso die Reihenfolge der Code-Ausführung darstellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Kontext==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für jede Web-Seite, unabhängig davon ob sie im separaten Fenster oder als Tab angezeigt wird,&lt;br /&gt;
erzeugt der Browser einen separaten isolierten JavaScript-Kontext, in dem Code ausgeführt wird.&lt;br /&gt;
Das bedeutet, dass alle Objekte und Funktionen nur so lange existieren bis die Seite neu geladen oder verlassen wird.&lt;br /&gt;
Ein Zugriff auf andere Seiten ist aus Sicherheitsgründen nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
=Window=&lt;br /&gt;
&lt;br /&gt;
Das globale Objekt &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; referenziert alle im Browser verfügbaren Objekte und Werte als Eigenschaften (native und host).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.Object);&lt;br /&gt;
console.log(window.XMLHttpRequest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf globale Eigenschaften ist es nicht notwendig explizit &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; zu schreiben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Date == window.Date);&lt;br /&gt;
console.log(new Date());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht innerhalb von Funktionen deklarierten Variablen werden automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var globaleVariable = &#039;global&#039;;&lt;br /&gt;
var globaleFunktion = function() {};&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
console.log(window.globaleFunktion);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modifikation von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Da es sich um ein normales Objekt handelt können die meisten Eigenschaften modifiziert und auch gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Veränderungen von globalen Eigenschaften sind nicht sinnvoll und können schwerwiegende Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.Object = {};&lt;br /&gt;
var objekt = new Object();&lt;br /&gt;
&lt;br /&gt;
delete window.Array;&lt;br /&gt;
var array = new Array();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt wird vom Browser mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; erzeugt, welche auch global verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.constructor == window.Window);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Popups und Frames==&lt;br /&gt;
&lt;br /&gt;
Neben dem globalen Fenster-Objekt kann eine Web-Seite beliebig viele weitere &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekte enthalten.&lt;br /&gt;
Dabei handelt es sich dann entweder um durch Code erzeugte Popups oder aber um Frames (besser bekannt als iframes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.open(&#039;https://www.google.com&#039;, &#039;Google im Popup&#039;, &#039;width=400,height=300,resizable=yes&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frames können entweder durch das entsprechende HTML oder aber auch wie im Code gezeigt programmatisch erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
==Browser-Schnittstellen==&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den nativen Objekten notwendigen Objekte enthält &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; wichtige Browser- und Geräte-Schinttstellen.&lt;br /&gt;
Dazu zählen zum Beispiel Funktionen um Dialoge im Browser zu öffnen oder aber sogar um Game-Controller zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = window.prompt(&#039;Wie ist Ihr Name?&#039;);&lt;br /&gt;
window.alert(&#039;Hello &#039; + name);&lt;br /&gt;
window.alert(&#039;Die aktuelle Seite ist &#039; + window.innerWidth + &#039;px breit&#039;);&lt;br /&gt;
&lt;br /&gt;
console.log(window.Gamepad);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Liste der verfügbaren Eigenschaften finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/de/docs/DOM/window dieser] MDN-Seite.&lt;br /&gt;
In den folgenden Abschnitten werden exemplarisch ein paar wichtige Objekte im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Beispiel für Browser-Schnittstellen=&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; ist ein globales Objekt welches die aktuelle URL und ihre Bestandteile enthält und diese auch verändern kann.&lt;br /&gt;
Das Objekt wird analog zum &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt; erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.location.constructor == window.Location);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen der URL===&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; enhtält die gesamte aktuelle URL. Alternativ kann auch &amp;lt;code&amp;gt;location.toString()&amp;lt;/code&amp;gt; genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.href);&lt;br /&gt;
console.log(location.toString());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einzelne Bestandteile der URL ermitteln zu können werden viele separate Eigenschaften bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.protocol);&lt;br /&gt;
console.log(location.host);&lt;br /&gt;
console.log(location.port);&lt;br /&gt;
console.log(location.pathname);&lt;br /&gt;
console.log(location.hash);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verändern der URL===&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften können nicht nur lesend genutzt werden, sondern auch um Änderungen an der aktuellen URL vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Mit der Ausname von &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; führen Änderungen der Eigenschaften zum Verlassen der aktuellen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.protocol = &#039;http&#039;;&lt;br /&gt;
location.port = &#039;8080&#039;;&lt;br /&gt;
location.hash = &#039;#anker&#039;;&lt;br /&gt;
location.href = &#039;https://www.google.com&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es ein paar Funktionen um die URL zu modifizieren oder aber die Seite neuzuladen:&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.assign(&#039;https://www.google.com&#039;);&lt;br /&gt;
location.reload(true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
Das globale &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt;-Objekt ermöglicht den programmatischen Zugriff auf den Browser-Verlauf.&lt;br /&gt;
Es werden Funktionen zur Verfügung gestellt um im Verlauf beliebig viele Schritte zurück und vorwärts zu gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
history.back();&lt;br /&gt;
history.forward();&lt;br /&gt;
history.go(-3);&lt;br /&gt;
history.go(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Aus Sicherheitsgründen ist es nicht erlaubt auf Informationen einzelner Einträge im Verlauf zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
==Navigator==&lt;br /&gt;
&lt;br /&gt;
Für detaillierte Informationen über den aktuellen Client bzw. Browser existiert das &amp;lt;code&amp;gt;navigator&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
Die meistgenutzte Eigenschaft &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; ermöglicht das Feststellen des Browser-Herstellers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(navigator.userAgent);&lt;br /&gt;
console.log(navigator.battery);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Document Object Model=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt können beliebig viele Dokumentenobjekte zugeordnet werden, mindestens aber ein Hauptdokument.&lt;br /&gt;
Das Hauptdokument wird über die globale Variable &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; zur Verfügung gestellt.&lt;br /&gt;
Die Schnittstelle für den Dokumentenzugriff wird durch das [http://www.w3.org/DOM/ Document Object Model] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektmodell==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekt repräsentiert ein vom Browser interpretiertes HTML-Dokument als Objektmodell mit einer Baumstruktur.&lt;br /&gt;
Dabei werden Tags, Texte und Kommentare in Knoten umgewandelt, wobei Tag-Knoten wiederum Unterknoten haben können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
      Text&lt;br /&gt;
      &amp;lt;!-- Kommentar --&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Eingabe&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Markup wird in folgendes Objektmodell übersetzt:&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;html&#039;&#039;&#039;-Knoten mit den Unterknoten &#039;&#039;&#039;head&#039;&#039;&#039; und &#039;&#039;&#039;body&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;head&#039;&#039;&#039;-Knoten mit dem Unterknoten &#039;&#039;&#039;title&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;title&#039;&#039;&#039;-Knoten mit einem Text-Unterknoten&lt;br /&gt;
* Ein &#039;&#039;&#039;body&#039;&#039;&#039;-Knoten mit den Unterknoten &#039;&#039;&#039;p&#039;&#039;&#039; und &#039;&#039;&#039;input&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;p&#039;&#039;&#039;-Knoten mit einem Text- und einem Kommentar-Unterknoten&lt;br /&gt;
* Ein &#039;&#039;&#039;input&#039;&#039;&#039;-Knoten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Achtet man bei HTML auf eine korrekte Einrückung so ist das resultierende Objektmodell meist gut erkennbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Markup-Korrekturen===&lt;br /&gt;
&lt;br /&gt;
Bei dem Objektmodell handelt es sich &#039;&#039;&#039;nicht&#039;&#039;&#039; um exaktes Abbild des originalen Markups.&lt;br /&gt;
Der Unterschied wird klar, wenn man das Resultat von invalidem HTML untersucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Tabelle&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Browser fügt zwischen dem &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;- und dem &amp;lt;code&amp;gt;tr&amp;lt;/code&amp;gt;-Knoten einen &amp;lt;code&amp;gt;tbody&amp;lt;/code&amp;gt;-Knoten ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau von Dokumenten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Node-Objekte===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Knoten innerhalb eines Dokumentenobjekts ist direkt oder indirekt abgeleitet vom &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Konstruktor/-Prototypen.&lt;br /&gt;
Mit Ausnahme des Dokumentenobjekts selbst wird allen Knoten ein Dokument zugeordnet durch die &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;-Eigenschaft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des Weiteren hat jeder Knoten einen numerischen Typen, der in der Eigenschaft &amp;lt;code&amp;gt;nodeType&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
Die gängisten Typen von Dokumentenknoten sind:&lt;br /&gt;
&lt;br /&gt;
* 1: ELEMENT_NODE&lt;br /&gt;
* 3: TEXT_NODE&lt;br /&gt;
* 8: COMMENT_NODE&lt;br /&gt;
* 9: DOCUMENT_NODE&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Referenz der Eigenschaften von Node-Objekten finden Sie auf&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Web/API/Node dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Document-Objekte===&lt;br /&gt;
&lt;br /&gt;
Das Dokument selbst repräsentiert ein abstraktes Dokument und somit kein HTML-Element.&lt;br /&gt;
Es verweist aber auf das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element mit der Eigenschaft &amp;lt;code&amp;gt;documentElement&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe eines Dokuments ist es möglich neue &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekte zu erstellen, einzufügen und diese zu suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Element-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jedes HTML-Tag wird in einen Knoten übersetzt, welcher mit dem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Konstruktor erzeugt wird.&lt;br /&gt;
Element-Objekte besitzen Schnittstellen um auf Eigenschaften des Tags zuzugreifen und diese zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement.tagName);&lt;br /&gt;
console.log(document.documentElement.innerHTML);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie Dokumente können Element-Objekten weitere Node-Objekte als Unterknoten angehängt und nach ihnen gesucht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neue Element-Objekte werden über die Funktion &amp;lt;code&amp;gt;createElement()&amp;lt;/code&amp;gt; eines &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekts unter Angabe des Tag-Namens erzeugt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
console.log(absatz.tagName);&lt;br /&gt;
console.log(absatz.nodeType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung wird das neue Element dem augerufenen Dokument durch die Eigenschaft &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt; als zugehörig markiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var block = document.createElement(&#039;div&#039;);&lt;br /&gt;
console.log(block.ownerDocument);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da die Schnittstelle eines Dokuments nicht mit HTML-Standards gekoppelt ist, können beliebige Tag-Namen vergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinElement = document.createElement(&#039;mein-element&#039;);&lt;br /&gt;
console.log(meinElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Suchen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig bei der Arbeit mit Dokumenten ist die Suche von einzelnen oder mehreren Elementen.&lt;br /&gt;
Aufgrund dessen haben sich die Schnittstellen für die Suche im Browser über die letzten Jahre rapide verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorgefertige Kriterien===&lt;br /&gt;
&lt;br /&gt;
Die ursprünglichen Funktionen zum Suchen von Elementen erlauben wenige festgelegte Kriterien.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeld = document.getElementById(&#039;spielfeld&#039;);&lt;br /&gt;
console.log(spielfeld);&lt;br /&gt;
&lt;br /&gt;
var divElemente = document.getElementsByTagName(&#039;div&#039;);&lt;br /&gt;
console.log(divElemente);&lt;br /&gt;
&lt;br /&gt;
var gegnerElemente = document.getElementsByClassName(&#039;gegner&#039;);&lt;br /&gt;
console.log(gegnerElemente.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Weise können Elemente anhand der ID, Klasse oder des Tag-Namen gesucht werden.&lt;br /&gt;
Der Rückgabewert ist bei der ID-Suche ein &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Objekt und bei den anderen eine &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt;, ein Array-artiges Objekt von Nodes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CSS-Selektoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Suche mithilfe von vorgefertigen Kriterien hat deutliche Limitierungen.&lt;br /&gt;
Deswegen enstand durch Bibliotheken wie jQuery das Konzept von Query-Selektoren, welche als&lt;br /&gt;
[http://www.w3.org/TR/CSS2/selector.html CSS-Selektoren] standardisiert werden und in vielen Browser verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine CSS-Selektorgruppe beschreibt beliebig viele Kriterien, die auf ein oder mehrere HTML-Elemente zutreffen.&lt;br /&gt;
Der Name wurde so gewählt, da diese ebenso in Stylesheets genutzt werden um Elemente auszuwählen.&lt;br /&gt;
Aufgrund der Kombinierbarkeit von CSS-Selektoren ergibt sich eine sehr mächtige Suchfunktionalität.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Funktionen für die Suche mit CSS-Selektoren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelector()&amp;lt;/code&amp;gt; liefert das erste Element zurück welches die Kriterien erfüllt&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelectorAll()&amp;lt;/code&amp;gt; liefert alle Elemente zurück welche die Kriterien erfüllen in Form einer &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Mögliche Kriterien====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das einfachste Kriterium für einen CSS-Selektor ist die Angabe eines Tag-Namen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.querySelectorAll(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Angabe einer ID eines HTML-Elements erfolgt durch eine vorangestellte Raute (&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeldElement = document.querySelector(&#039;#spielfeld&#039;);&lt;br /&gt;
console.log(spielfeldElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Klassen-Selektoren werden durch einen vorangestellten Punkt (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegnerElemente = document.querySelectorAll(&#039;.gegner&#039;);&lt;br /&gt;
console.log(gegnerElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Mächtigkeit von CSS-Selektoren ergibt sich vor allem durch die beliebige Kombinationsmöglichkeiten von Selektoren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var schwierigeGegnerElemente =&lt;br /&gt;
  document.querySelectorAll(&#039;.gegner.schwierig&#039;);&lt;br /&gt;
console.log(schwierigeGegnerElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 1:&#039;&#039;&#039; Die Komplexität einer CSS-Selektorgruppe beeinflusst die Performance einer Suche.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 2:&#039;&#039;&#039; Eine vollständige Erklärung der Funktionsweise von CSS-Selektoren ist nicht Ziel dieses Tutoriums.&lt;br /&gt;
Diese Einführung dient lediglich dazu ein grundsätzliches Verständnis für den Umgang mit Selektoren zu vermitteln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hinzufügen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neu erstellte Elemente können im Dokument als untergeordnete Knoten mithilfe von &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
document.documentElement.appendChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der künftig übergeordnete Knoten muss angesprochen werden, wenn das Element an einer bestimmten Stelle landen soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.querySelector(&#039;div&#039;);&lt;br /&gt;
var spielfeld = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielfeld.appendChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifizieren von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe der entsprechenden DOM-Schnittstellen können Text, HTML, Attribute sowie das Styling von Elementen beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von Text und HTML===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der gesamte HTML-Inhalt eines Elements kann mithilfe der Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;Hallo Welt&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von einfachen Text-Änderungen lässt sich sogar das gesamte enthaltene HTML beeinflussen.&lt;br /&gt;
Anstatt also mit der DOM-API einzelne Elemente zu erzeugen kann einfach Markup als Wert zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;p&amp;gt;Hallo &amp;lt;strong&amp;gt;Welt!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von Attributen===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die Attribute eines HTML-Elements gibt es die Funktionen &amp;lt;code&amp;gt;getAttribute()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Beide akzeptieren als erstes Argument den Namen des Attributs, der Setter akzeptiert außerdem einen zu setzenden Wert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielerElement.innerHTML = &#039;_|_&#039;;&lt;br /&gt;
spielerElement.setAttribute(&#039;class&#039;, &#039;spieler&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(spielerElement);&lt;br /&gt;
&lt;br /&gt;
console.log(spielerElement.getAttribute(&#039;class&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Besonders häufige Attributsänderungen sind das Hinzufügen und/oder Entfernen von Klassen.&lt;br /&gt;
Dafür gibt es in neueren Browsern die Liste &amp;lt;code&amp;gt;classList&amp;lt;/code&amp;gt; auf jedem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt, welche die Arbeit erleichtert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
spielerElement.classList.add(&#039;unbesiegbar&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von CSS-Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neben dem Document Object Model existiert außerdem der [http://dev.w3.org/csswg/cssom/ CSS Object Model Standard]&lt;br /&gt;
welcher die Schnittstelle für den Zugriff auf CSS-Eigenschaften von DOM-Objekten standardisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein jedes DOM-Element vom Typ &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; besitzt eine Eigenschaft &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; welche alle CSS-Eigenschaften beherbergt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
console.log(body.style.color);&lt;br /&gt;
console.log(body.style.padding);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften spiegeln die in Stylesheets definierten Regeln wieder, jedoch inklusive dem kaskadierenden Charakter.&lt;br /&gt;
Das heisst dass ein Element-Objekt nicht zwingend selbst eine &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; besitzt, diese jedoch für die Anzeige vererbt bekommt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften können ebenso beliebig modifiziert werden, was zu einer sofortigen Anpassung der Darstellung führt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.style.backgroundColor = &#039;#AAF&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie neue Elemente einem Dokument hinzugefügt werden können, so können diese oder bestehende auch gelöscht werden.&lt;br /&gt;
Dazu muss man den übergeordneten Knoten ansteuern und mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt; die Entfernung durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeld = document.querySelector(&#039;.spielfeld&#039;);&lt;br /&gt;
var spielerElement = spielfeld.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
spielfeld.removeChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist einem der übergeordnete Knoten nicht bekannt so kann diesen mithilfe der Knotenverweise ermitteln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var entferneKnoten = function(knoten) {&lt;br /&gt;
  if (!knoten.parentNode) {&lt;br /&gt;
    throw new Error(&#039;no parent node&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  knoten.parentNode.removeChild(knoten);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spielerElement = document.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
entferneKnoten(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=DOM Events=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisorientierte Programmierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für die Verarbeitung von stets verfügbaren Informationen eignet sich ein sequentieller Ablauf von Befehlen.&lt;br /&gt;
Ergeben sich Informationen jedoch dynamisch zur Laufzeit kann die ereignisorientierte Programmierung genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Hierbei wird nicht aktiv auf eine Information gewartet, das Programm wird benachrichtigt wenn ein Ereignis eintritt.&lt;br /&gt;
Somit gibt es nicht nur einen Kontrollfluss, sondern beliebig viele, welche sogar parallel ablaufen können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisse im Browser==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Interaktion mit Websites werden viele Ereignisse ausgelöst.&lt;br /&gt;
Zuerst wird die HTML-Seite geladen und gerendert, danach geschieht dies für alle referenzierten Inhalte.&lt;br /&gt;
Diese Vorgänge lösen Ereignisse aus, welche durch den Browser selbst verursacht werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel gibt es Ereignisse für Medien, welche beschreiben, dass diese fertig geladen wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald der Browser beginnt eine Web-Seite zu rendern können Ereignisse durch den Benutzer ausgelöst werden.&lt;br /&gt;
Fast jede Interaktion löst ein Ereignis aus, welches wiederum in bestimmten Reaktionen resultiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
Klickt der Benutzer einen Link so ist das ein Ereignis, welches zur Folge hat dass die eine URL geladen wird.&lt;br /&gt;
Wird ein Scroll-Balken bewegt ergibt sich daraus ein Ereignis, welches den Browser scrollen lässt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zu den wichtigsten Arten von durch Benutzer ausgelöste Ereignissen zählen:&lt;br /&gt;
Mausbewegungen und -klicks, Tastatureingaben und Scrolling.&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Auflistung von Ereignissen finden Sie auf [https://developer.mozilla.org/en-US/docs/Web/Events dieser] MDN-Seite.&lt;br /&gt;
Nebem dem Benutzer gibt es noch andere Auslöser wie zum Beispiel verbundene Server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau eines Ereignisses==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein im Browser auftretendes Ereignis besitzt immer drei folgende Merkmale:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Name:&#039;&#039;&#039; eine Zeichenkette die das Ereignis in der Gegenwart beschreibt, z.B. &amp;quot;click&amp;quot; oder &amp;quot;mousemove&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Daten:&#039;&#039;&#039; ein Datenobjekt mit einer pro Ereignis festgelegten Struktur&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Ziel:&#039;&#039;&#039; ein Objekt das als Ziel des Ereignis gilt; in der Regel handelt es sich um DOM-Elemente&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine &#039;&#039;&#039;Tastatureingabe&#039;&#039;&#039; in einem &#039;&#039;&#039;Formularfeld&#039;&#039;&#039;, bei dem das Zeichen &#039;&#039;&#039;@&#039;&#039;&#039; eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Phasen der Ereignispropagierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei dem ursprünglichen Ziel eines Ereignisses um ein DOM-Objekt werden in der Regel drei Phasen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Capturing-Phase===&lt;br /&gt;
&lt;br /&gt;
In Phase 1, der &#039;&#039;&#039;Capturing-Phase&#039;&#039;&#039;, wird ein Ereignis mit dem obersten Dokumentenknoten als Ziel ausgelöst.&lt;br /&gt;
Dabei handelt es sich in der Regel um das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt, welches alle andere Nodes als Unterknoten enthält.&lt;br /&gt;
Es werden dann schrittweise Ereignisse ausgelöst für jeden Unterknoten auf dem Pfad zum ursprünglichen Ereignisziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
+ window      - Ereignis mit window als aktuelles Ziel (optional)&lt;br /&gt;
  + document  - Ereignis mit body als aktuelles Ziel&lt;br /&gt;
    + body    - Ereignis mit body als aktuelles Ziel&lt;br /&gt;
      + p     - ursprüngliches Ziel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Bei manchen Ereignissen ist &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; das oberste Objekt in der Hierarchie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Target-Phase===&lt;br /&gt;
&lt;br /&gt;
Ist der Browser beim ursprünglichen Ziel angelangt wird in Phase 2 gewechselt, der sogenannten &#039;&#039;&#039;Target-Phase&#039;&#039;&#039;.&lt;br /&gt;
Dabei wird ein einzelnes Ereignis ausgelöst, für welches das ursprüngliche DOM-Objekt als Ziel verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bubbling-Phase===&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss der Ereignispropagierung wechselt der Browser in Phase 3, der sogenannten &#039;&#039;&#039;Bubbling-Phase&#039;&#039;&#039;.&lt;br /&gt;
Hierbei wird der Pfad der Capturing-Phase in umgekehrter Richtung durchlaufen und jeweils wieder ein Ereignis ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In Bibliotheken wie jQuery hat man nur Zugriff auf die Bubbling-Phase, nicht auf die Capturing-Phase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Browser-Unterschiede===&lt;br /&gt;
&lt;br /&gt;
Capturing und Bubbling bilden die Tatsache ab, dass wenn ein Ereignis auf einem Element stattfindet,&lt;br /&gt;
dieses Ereignis ebenso für die übergeordneten Elemente gültig ist.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wird ein Mensch in einem Krankenhaus geboren, so wird er auch in einer Stadt und in einem Land geboren.&lt;br /&gt;
&lt;br /&gt;
Einer der beiden Phasen wäre ausreichend für die Ereignisvearbeitung.&lt;br /&gt;
Aufgrund von unterschiedlichen Browser-Implementierungen existieren heutzutage jedoch beide gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Globale Ereignisse===&lt;br /&gt;
&lt;br /&gt;
Beschreibt ein Ereignis ein globales Geschehen wird oftmals das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als Ereignisziel verwendet.&lt;br /&gt;
In diesen Fällen ist es möglich dass weder Capturing- noch eine Bubbling-Phase durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Ergeinis &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; beschreibt, dass eine Seite (ohne seine externen Medien) fertig geladen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe der DOM-Schnittstelle erhält man die Möglichkeit Ereignisse selbst zu verarbeiten und darauf zu reagieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anmeldung===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt; kann auf jedem DOM-Objekt, dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt und dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt aufgerufen werden.&lt;br /&gt;
Dabei ist das Objekt auf dem die Funktion aufgerufen das &#039;&#039;&#039;Ziel&#039;&#039;&#039; des Ereignisses, welches verarbeiten werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion akzeptiert die folgenden drei Argumente:&lt;br /&gt;
* den &#039;&#039;&#039;Namen des Ereignisses&#039;&#039;&#039; das man verarbeiten möchte in Form eines Strings&lt;br /&gt;
* die &#039;&#039;&#039;Callback-Funktion&#039;&#039;&#039; welche das Ereignis-Objekt erwartet und den Code zur Verarbeitung enthält&lt;br /&gt;
* ein optionales &#039;&#039;&#039;Flag&#039;&#039;&#039; das bestimmt ob das Ereignis in der Capturing- oder Bubbling-Phase verarbeitet werden soll&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist das Flag &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, was bedeutet dass das Ereignis in der Bubbling-Phase verarbeitet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es wird für ein Ereignis auf einem Ziel ein Event-Lister in Form einer Funktion angemeldet.&lt;br /&gt;
Beim Eintreten des Ereignisses wird der sogenannte Callback aufgerufen und das entsprechende Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var seiteWurdeGeladen = function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite ist nun fertig geladen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
}&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, seiteWurdeGeladen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;a id=&amp;quot;link&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
var link = document.querySelector(&#039;#link&#039;);&lt;br /&gt;
var linkWurdeGeklickt = function(event) {&lt;br /&gt;
  console.log(&#039;Der Link wurde geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
link.addEventListener(&#039;click&#039;, linkWurdeGeklickt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Phasen der Ereignispropagierung kann man Ereignisse global verarbeiten, unabhängig davon wo sie stattgefunden haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
var irgendwoWurdeGeklickt = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat irgendwo auf der Seite geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;click&#039;, irgendwoWurdeGeklickt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Callback ist eine Rückruffunktion, welche an ein andere Funktion übergeben wird und&lt;br /&gt;
zu späteren Zeitpunkten ggf. ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mausWurdeBewegt = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist jedoch nicht garantiert dass eine übergebene Callback-Funktion überhaupt jemals ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var esIstOktober = function(event) {&lt;br /&gt;
  console.log(&#039;Es ist Oktober&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var istEsOktober = function(callback) {&lt;br /&gt;
  if (new Date().getMonth() == 9) callback();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
istEsOktober(esIstOktober);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ereignis-Objekte===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedem Event-Listener-Callback wird beim Aufruf ein für ein Ereignis spezifisches Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
  console.log(event.screenX);&lt;br /&gt;
  console.log(event.screenY);&lt;br /&gt;
  console.log(event.button);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieses Objekt enthält neben spezifischen auch generelle Ereignisinformationen wie zum Beispiel das Ereignis-Ziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich der drei Event-Phasen unterscheidet man zwischen ursprünglichem und aktuellem Ziel.&lt;br /&gt;
Das aktuelle Ziel ist das für welches das Ereignis aktuell gilt und das ursprüngliche das wo es stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target); // ursprüngliches Ziel&lt;br /&gt;
  console.log(event.currentTarget); // aktuelles Ziel&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Ziel &amp;lt;code&amp;gt;currentTarget&amp;lt;/code&amp;gt; entspricht also immer dem Objekt auf dem man den Event-Handler angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abmeldung===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;removeEventListener&amp;lt;/code&amp;gt; kann ein angemeldeter Event-Listener wieder entfernt werden.&lt;br /&gt;
Diese Funktion nur zwei Argumente: Den Ereignis-Namen und die Event-Listener-Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mausWurdeBewegt = function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
document.removeEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Standardverhalten===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nachdem alle Ereignisse verarbeitet wurden führt der Browser gegegebenfalls eine &amp;quot;Default Action&amp;quot; aus.&lt;br /&gt;
Eine solche Aktion ist das Standardverhalten des Browsers als Reaktion auf das eingetretene Ereignis.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Benutzer klickt auf einen Link -&amp;gt; der Browser lädt die URL&lt;br /&gt;
* Benutzer führt Tastatureingaben in einem Feld aus -&amp;gt; der Browser fügt die Zeichen dem Feld hinzu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Event-Listener-Funktion ist es möglich mithilfe von &amp;lt;code&amp;gt;preventDefault()&amp;lt;/code&amp;gt; das Standardverhalten zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
      event.preventDefault();&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben dargestellte Code führt dazu, dass kein Klick auf einen Link die enthaltene URL aufruft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wichtige Events==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse sind die wichtigsten in der täglichen browser-seitingen Anwendungsentwicklung mit JavaScript.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===DOMContentLoaded===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis beschreibt, dass das HTML geladen und interpretiert wurde und das DOM und CSSOM erzeugt und gerendert wurde.&lt;br /&gt;
Es wird keine Aussage darüber gemacht ob weitere externe Inhalte bereits geladen wurden, wie z.B. Bilder.&lt;br /&gt;
Das Ereignis wird ausschliesslich auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt als Ereignisziel ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Mit der Seite kann interagiert werden&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===load===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis besagt, dass die gesamte Web-Seite inklusive aller externen referenziereten Inhalte gerendert wurden.&lt;br /&gt;
Im Gegensatz zu &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; wird dieses Ereignis ausschliesslich auf dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&#039;load&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite wurde vollständig geladen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===click===&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn der Benutzer (mit der Maus) auf ein sichtbares DOM-Element klickt wird dieses Ereignis ausgelöst.&lt;br /&gt;
Bei der Propagierung dieses Ereignisses werden wie alle drei Ereignisphasen (Capturing, Bubbling, Target) durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat auf etwas geklickt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===mousemove, mouseover, mouseout===&lt;br /&gt;
&lt;br /&gt;
Bei Mausbewegungen über DOM-Element wird konstant das Ereignis &amp;lt;code&amp;gt;mousemove&amp;lt;/code&amp;gt; mit den entsprechenden Koordinaten ausgelöst.&lt;br /&gt;
Das Ereignis &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt; wird erzeugt wenn die Maus in ein Element eindringt, &amp;lt;code&amp;gt;mouseout&amp;lt;/code&amp;gt; wenn es wieder verlassen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseover&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus über etwas bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseout&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus von etwas weg bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===keydown, keyup, keypress===&lt;br /&gt;
&lt;br /&gt;
Bei Tastatureingaben durch Benutzer auf einem Element werden die Ereignisse &amp;lt;code&amp;gt;keydown&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;keypress&amp;lt;/code&amp;gt; ausgelöst.&lt;br /&gt;
Die drei unterschiedlichen Ereignisse beschreiben die unterschiedlichen Phasen einer Tastatureingabe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;keydown&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste gedrückt&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keypress&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste betätigt&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keyup&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste losgelassen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von DOM Events kann auch ein genereller Event-Mechanismus für JavaScript implementiert werden.&lt;br /&gt;
Dazu wird ein DOM-Element erzeugt, welches als virtuelles Ereignisziel dient und nicht ins Dokument eingehängt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var EventDispatcher = function() {&lt;br /&gt;
&lt;br /&gt;
  var target = document.createElement(&#039;div&#039;);&lt;br /&gt;
&lt;br /&gt;
  this.addEventListener = function(type, callback) {&lt;br /&gt;
    target.addEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.dispatchEvent = function(type, detail) {&lt;br /&gt;
    var event = new CustomEvent(type, {&lt;br /&gt;
      bubbles: true,&lt;br /&gt;
      canceable: true,&lt;br /&gt;
      detail: detail&lt;br /&gt;
    });&lt;br /&gt;
    target.dispatchEvent(event);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.removeEventListener = function(type, callback) {&lt;br /&gt;
    target.removeEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Klasse kann dann in beliebigen anderen Komponenten dazu genutzt werden um Ereignisse zu erzeugen und zu propagieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.eventDispatcher = new EventDispatcher();&lt;br /&gt;
&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    this.eventDispatcher.dispatchEvent(&#039;springen&#039;, this);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.wennSpielerSpringt = function(callback) {&lt;br /&gt;
    this.eventDispatcher.addEventListener(&#039;springen&#039;, callback);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler.wennSpielerSpringt(function() {&lt;br /&gt;
  console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
});&lt;br /&gt;
spieler.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Timer=&lt;br /&gt;
&lt;br /&gt;
Timer in JavaScript dienen dazu um CPU-intensive Berechnungen in mehrere Teile zu spalten und um Animation zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Thread==&lt;br /&gt;
&lt;br /&gt;
Der Browser stellt für jede dargestellte Web-Seite einen einzelnen Thread zur Verfügung.&lt;br /&gt;
Dieser kümmert sich um das Rendering der Web-Seite, die Verarbeitung von Events und die Ausführung von JavaScript.&lt;br /&gt;
Mit Ausnahme des HTML5-Standards der WebWorker gibt es dementsprechend in JavaScript kein Multithreading.&lt;br /&gt;
&lt;br /&gt;
Intern bestitzt der Thread eine Liste an Aufgaben die er stets als nächstes ausführen wird, der sogenannten Queue.&lt;br /&gt;
Wird eine Web-Seite zum ersten Mal geladen verursacht dies gleich mehrere Einträge in der Queue, wie zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
* Parsen des Markups und Aufbau des DOMs&lt;br /&gt;
* Parsen des CSS und Aufbau des CSSOMs&lt;br /&gt;
* Rendering der Seite&lt;br /&gt;
* Ausführung von geladenem JavaScript-Code&lt;br /&gt;
&lt;br /&gt;
Manche Aufgaben benötigen unter Umständen viel Zeit und können so auch die Ausführung anderer Aufgaben beeinflussen.&lt;br /&gt;
Nimmt ein Stück JavaScript-Code die CPU zu lange in Anspruch kann der Browser z.B. keine Benutzereingaben mehr vearbeiten.&lt;br /&gt;
Um dies zu vermeiden ist ein Zeit- bzw. Code-Limit für JavaScript eingebaut bevor der Browser eine Warnung ausgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var wartezeitInMs = 5000;  &lt;br /&gt;
while (new Date() - programmStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Timeouts==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;setTimeout(callback, delayMs)&amp;lt;/code&amp;gt; kann man einen einmalig auszuführenden Timer auf der Thread-Queue anmelden.&lt;br /&gt;
Die übergebene Callback-Funktion wird &#039;&#039;&#039;ungefähr&#039;&#039;&#039; nach einer Wartezeit mit Länge der übergebenen Dauer ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Es werden Einträge in der Thread-Queue erzeugt die überprüfen ob es Zeit ist den Callback auszuführen und das dann ggf. tun.&lt;br /&gt;
Aufgrund der vielen Aufgaben des Threads kann die Wartezeit überschritten werden, wenn andere Aufgaben viel Zeit beanspruchen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(&#039;Nachricht &#039; + vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 500);&lt;br /&gt;
while (new Date() - programmStart &amp;lt; 1000) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Wartezeit von 0 Millisekunden heißt, dass der Interpreter die Callback-Funktion so bald wie möglich ausführen soll. &lt;br /&gt;
Abhängig von der Browser-Implementierung kann es sein dass die minimale Wartezeit aber bis zu 15 Millisekunden beträgt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(&#039;Nachricht &#039; + vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist möglich mit Timern CPU-intensive Aufgaben in mehrere Teile zu spalten oder auch Aufgaben wiederholt auszuführen.&lt;br /&gt;
Dazu erzeugt man einfach eine Funktion welche sich wiederum selbst durch einen &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt;-Aufruf als Timer registriert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll die wiederholte Ausführung beendet werden kann dies durch einen Aufruf von &amp;lt;code&amp;gt;clearTimeout(timeoutId)&amp;lt;/code&amp;gt; erreicht werden.&lt;br /&gt;
Dabei wird der Eintrag mit gegebener Timeout-ID aus der Thread-Queue gelöscht wodurch der angemeldete Timer nicht ausgeführt wird.&lt;br /&gt;
Die notwendige Timeout-ID für die Abmeldung wird beim Anmelden durch &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; als numerischer Rückgabewert bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var timeoutId = null;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  timeoutId = setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearTimeout(timeoutId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; eignet sich vor allem für wiederholende Aufgaben welche nichts mit Rendering zu tun haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Intervalle==&lt;br /&gt;
&lt;br /&gt;
Außerdem existiert die Funktion &amp;lt;code&amp;gt;setInterval(callback, delayMs)&amp;lt;/code&amp;gt; welche einen wiederholt auszuführenden Timer regsitriert.&lt;br /&gt;
Es wird ebenso eine Callback-Funktion erwartet und eine Wartezeit zwischen den einzelnen Ausführungen des Callbacks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; wird eine Interval-ID zurückgegeben, welche für die Abmeldung mittels &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
var intervalId = setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearInterval(intervalId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst wirkt &amp;lt;code&amp;gt;setInterval()&amp;lt;/code&amp;gt; komfortabler, da der Callback nicht durch die wiederholende Timer-Registrierung verunreinigt wird.&lt;br /&gt;
Jedoch besteht bei dieser Funktion der Nachteil dass die Messung der Wartezeit &#039;&#039;&#039;vor&#039;&#039;&#039; Ausführung des Callbacks beginnt.&lt;br /&gt;
Registriert man eine Aufgabe die länger braucht als die definierte Wartezeit wird der JavaScript-Thread sehr stark beansprucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var warteEineBestimmeZeit = function() {&lt;br /&gt;
  var funktionsStart = new Date();&lt;br /&gt;
  var wartezeitInMs = 50;&lt;br /&gt;
  while (new Date() - funktionsStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
    // nichts tun&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
setInterval(warteEineBestimmeZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obwohl der Browser zwar noch CPU-Zeit zur Verfügung hat ist er fast nur damit beschäftigt die überfälligen Callbacks auszuführen.&lt;br /&gt;
Aufgrund dessen ist es sinnvoller &amp;lt;code&amp;gt;setInterval()&amp;lt;/code&amp;gt; für wiederholende Aufgaben zu verwenden deren Dauer nicht exakt vorhersehbar ist.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der vielen verschiedenen Aufgaben des JavaScript-Threads ist eine exakte Wartezeit bei Timern nicht garantiert.&lt;br /&gt;
Sollen Werte abhängig von der vergangenen Zeit verändern sollten Datum-Objekte in die Berechnungen mit einbezogen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var objekt = {position: 0, geschwindigkeitProSekunde: 1};&lt;br /&gt;
var letzterTimerAufruf = new Date();&lt;br /&gt;
var bewegeObjekt = function() {&lt;br /&gt;
  var vergangeneZeitInMs = new Date() - letzterTimerAufruf;&lt;br /&gt;
  objekt.position += geschwindigkeitProSekunde * (vergangeneZeitInMs / 1000);&lt;br /&gt;
  console.log(&#039;Aktuelle Position: &#039; + objekt.position);&lt;br /&gt;
  letzterTimerAufruf = new Date();&lt;br /&gt;
  setTimeout(bewegeObjekt, 1000);&lt;br /&gt;
};&lt;br /&gt;
bewegeObjekt();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Frames==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; ist es möglich neben wiederholenden Aufgaben auch Animationen im Browser zu implementieren.&lt;br /&gt;
Dazu werden in der Callback-Funktion einfach die zu bewegenden Elemente entsprechend in ihrer Form und Position verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
div.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeRechteck = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  div.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  setTimeout(bewegeRechteck, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeRechteck();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird versucht dass Rechteck ca. 60 Mal in der Sekunde zu bewegen, also eine Bildwiederholrate von 60 simuliert.&lt;br /&gt;
Es kann allerdings vorkommen dass der Browser viele anderen Dingen zu tun hat und ihn ein solcher Timer zusätzlich sehr beansprucht.&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es speziell für Animationen und visuelle Änderungen die Funktion &amp;lt;code&amp;gt;requestAnimationFrame(callback)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese erwartet lediglich einen Callback und kümmert sich intern darum wann der Callback das nächste Mal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
div.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeRechteck = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  div.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  requestAnimationFrame(bewegeRechteck, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeRechteck();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;clearTimeout()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; gibt es die Funktion &amp;lt;code&amp;gt;cancelAnimationFrame(frameId)&amp;lt;/code&amp;gt; für die Abmeldung.&lt;br /&gt;
Diese akzeptiert eine Frame-ID welche wiederum von &amp;lt;code&amp;gt;requestAnimationFrame()&amp;lt;/code&amp;gt; zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist empfehlenswert Animation mit &amp;lt;code&amp;gt;requestAnimationFrame&amp;lt;/code&amp;gt; zu implementieren.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_7&amp;diff=38266</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 7</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_7&amp;diff=38266"/>
		<updated>2015-10-15T10:30:03Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 7=&lt;br /&gt;
&lt;br /&gt;
==Rendering und Animation==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es ein einfaches Spiel mithilfe von Timern, DOM und SVG im Browser zu rendern.&lt;br /&gt;
&lt;br /&gt;
Das Spiel besteht darin herunterfallenden Hindernissen auszuweichen. Der Spieler wird mit den Cursortasten gesteuert.&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie einen neuen Ordner &amp;quot;aufgabe7&amp;quot; innerhalb Ihres Verzeichnis für die Praktikumsaufgaben.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Vorlagenordner &amp;quot;aufgabe7/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Die Vorlage enthält ein voll funktionierendes Spiel, welches aus den folgenden Komponenten besteht:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;model/Player.js&#039;&#039;&#039; - Modell eines Spielers&lt;br /&gt;
* &#039;&#039;&#039;model/Enemy.js&#039;&#039;&#039; - Modell eines Gegners&lt;br /&gt;
* &#039;&#039;&#039;model/EnemyFactory.js&#039;&#039;&#039; - Erzeugt in regelmäßigen Abständen zufällige Gegner&lt;br /&gt;
* &#039;&#039;&#039;model/Level.js&#039;&#039;&#039; - Modell eines physikalischen Levels; bewegt die Spielobjekte und überprüft Kollisionen&lt;br /&gt;
* &#039;&#039;&#039;controller/GameController.js&#039;&#039;&#039; - Verarbeitet Benutzereingaben und gibt Änderungen der Modelle an die Views weiter&lt;br /&gt;
* &#039;&#039;&#039;index.js&#039;&#039;&#039; - Startet das Spiel, erzeugt und orchestriert die einzelnen Komponenten&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;quot;index.js&amp;quot; wartet zunächst auf Eingaben durch den Benutzer um daraufhin das Spiel zu starten.&lt;br /&gt;
Dabei wird im ersten Schritt eine physikalische Welt erzeugt und ein Spieler dieser hinzugefügt.&lt;br /&gt;
Des Weiteren wird eine EnemyFactory erstellt, welche Gegner erzeugt, die auch der physikalischen Welt hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Damit die Spielobjekte im Browser gerendert werden können wird außerdem ein View-Objekt erzeugt.&lt;br /&gt;
Ebenso wie der physikalischen Welt werden die Spieler- und Gegner-Objekte auch der View hinzugefügt.&lt;br /&gt;
Welche View-Technologie verwendet wird um das Spiel darzustellen kann der Benutzer vor dem Spielstart entscheiden.&lt;br /&gt;
&lt;br /&gt;
===Funktionsweise von Views===&lt;br /&gt;
&lt;br /&gt;
Unabhängig davon welche Technologie zum Rendern verwendet wird, folgen die Views immer der gleichen Logik und Struktur.&lt;br /&gt;
Es gibt eine Konstruktorfunktion (&amp;lt;code&amp;gt;DOMView&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;SVGView&amp;lt;/code&amp;gt;) welche ein View-Objekt erzeugt.&lt;br /&gt;
Diese Konstruktorfunktion erwartet ein DOM-Element, in dem die Ansicht eingebaut werden soll, und eine Höhe und Breite.&lt;br /&gt;
&lt;br /&gt;
Sobald ein View-Objekt erzeugt wird, soll es sich automatisch um das regelmäßige Rendern der Spiels kümmern.&lt;br /&gt;
Dazu muss ein solches Objekt die zwei Funktionen &amp;lt;code&amp;gt;addObjectView()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;destroy()&amp;lt;/code&amp;gt; implementieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;addObjectView(object, color)&amp;lt;/code&amp;gt; erzeugt für ein gegebenes Objekt (z.B. Spieler) eine entsprechende View-Repräsentation.&lt;br /&gt;
Das Objekt wird als &#039;&#039;&#039;Rechteck&#039;&#039;&#039; an seiner x- und y-Position mit seiner Breite und Höhe und der gegegebenen Farbe dargestellt.&lt;br /&gt;
Verändert sich die Position des Objekts im Laufe des Spiels, so muss die View dies in regelmäßigen Abständen abbilden.&lt;br /&gt;
&lt;br /&gt;
Nutzen Sie einen geeigneten Timer, wie zum Beispiel &amp;lt;code&amp;gt;requestAnimationFrame()&amp;lt;/code&amp;gt;, um den Render-Vorgang wiederholt auszuführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var renderRepeatedly = function() {&lt;br /&gt;
  console.log(&#039;rendering&#039;);&lt;br /&gt;
  window.requestAnimationFrame(renderRepeatedly);&lt;br /&gt;
}&lt;br /&gt;
renderRepeatedly();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um beim Render-Durchgang festzustellen welches View-Objekt welche Positions- und Formänderungen abbilden muss,&lt;br /&gt;
muss die Verknüpfung von dem zu rendernden Objekt und dem View-Objekt in einer Liste gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Beispielhafte Implementierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var childViews = [];&lt;br /&gt;
this.addObjectView = function(object, color) {&lt;br /&gt;
  var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
  // ... style and add div element&lt;br /&gt;
  childViews.push({&lt;br /&gt;
    object: object,&lt;br /&gt;
    div: div&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;destroy()&amp;lt;/code&amp;gt; muss dafür Sorge tragen, dass eine View korrekt entfernt wird, inklusive aller verwendeten Timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Views implementieren===&lt;br /&gt;
&lt;br /&gt;
Im Folgenden gilt es die zwei unterschiedlichen Views zu implementieren, die das Spiel dann darstellen sollen.&lt;br /&gt;
Für jede View-Technologie ist im Vorlagen-Ordner bereits eine Datei angelegt mit einer minimalen Code-Vorgabe.&lt;br /&gt;
&lt;br /&gt;
====DOM-View====&lt;br /&gt;
&lt;br /&gt;
Implementieren Sie im ersten Schritt eine DOM-View, welche das Spiel mithilfe von DOM-Elementen darstellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Rechtecke können Sie einfach mit absolut positionierten &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;-Elementen darstellen.&lt;br /&gt;
&lt;br /&gt;
Beispielcode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var viewElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
viewElement.style.position = &#039;absolute&#039;;&lt;br /&gt;
viewElement.style.backgroundColor = &#039;green&#039;;&lt;br /&gt;
viewElement.style.width = &#039;40px&#039;;&lt;br /&gt;
viewElement.style.height = &#039;40px&#039;;&lt;br /&gt;
viewElement.style.left = &#039;5px&#039;;&lt;br /&gt;
viewElement.style.top = &#039;5px&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====SVG-View====&lt;br /&gt;
&lt;br /&gt;
Implementieren Sie anschließend eine SVG-View, welche das Spiel mithilfe von SVG-Elementen darstellt.&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn Sie SVG-Elemente mit der DOM-API erzeugen wollen müssen die Funktion &amp;lt;code&amp;gt;createElementNS()&amp;lt;/code&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var svg = document.createElementNS(&#039;http://www.w3.org/2000/svg&#039;, &#039;svg&#039;);&lt;br /&gt;
svg.setAttribute(&#039;version&#039;, &#039;1.1&#039;);&lt;br /&gt;
svg.setAttribute(&#039;width&#039;, &#039;500&#039;);&lt;br /&gt;
svg.setAttribute(&#039;height&#039;, &#039;500&#039;);&lt;br /&gt;
svg.setAttribute(&#039;x&#039;, &#039;10&#039;);&lt;br /&gt;
svg.setAttribute(&#039;y&#039;, &#039;10&#039;);&lt;br /&gt;
&lt;br /&gt;
var rect = document.createElementNS(&#039;http://www.w3.org/2000/svg&#039;, &#039;svg&#039;);&lt;br /&gt;
svg.appendChild(rect);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Optional: Darstellung anpassen===&lt;br /&gt;
&lt;br /&gt;
Ändern Sie die Views so ab, dass Spieler und Gegner nicht mehr als Rechtecke sondern als Bilder dargestellt werden.&lt;br /&gt;
Der Spieler kann zum Beispiel als Raumschiff und die Gegner als entgegenkommende Meteoriten dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Falls Sie Bilder aus dem Internet nutzen möchten achten Sie biite auf die entsprechenden Bildrechte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
&lt;br /&gt;
Nutzen Sie die folgenden Links für weitere Information über Timer und SVG:&lt;br /&gt;
&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setInterval&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/window.requestAnimationFrame&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38265</id>
		<title>JavaScript-Tutorium:Browser</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38265"/>
		<updated>2015-10-14T21:55:09Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* DOM Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten bei der JavaScript-Entwicklung im Browser zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Einführung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Native vs. Host==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer JavaScript-Umgebung existieren zwei Arten von Objekte.&lt;br /&gt;
&#039;&#039;&#039;Native Objekte&#039;&#039;&#039; werden von der Engine bereitgestellt und sind durch den ECMAScript-Standard abgedeckt.&lt;br /&gt;
&#039;&#039;&#039;Host-Objekte&#039;&#039;&#039; sind nicht immer standardisiert und werden von der Umgebung bereitgestellt.&lt;br /&gt;
Im Browser handelt es sich bei Host-Objekten um Schnittstellen für den Zugriff auf den Browser und externe Geräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==HTML5-Standard==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Obwohl es den ECMAScript-Standard gibt, muss man davon ausgehen,&lt;br /&gt;
dass sich die verfügbaren APIs von Browser zu Browser unterscheiden können.&lt;br /&gt;
Durch die steigende Entwicklungsgeschwindigkeit der Browser-Hersteller und den&lt;br /&gt;
[https://html.spec.whatwg.org/multipage/ HTML5-Standard] verbessert sich diese Situation.&lt;br /&gt;
&lt;br /&gt;
Heutzutage kann man davon ausgehen, dass jeweils die neuesten Versionen von Firefox und Chrome&lt;br /&gt;
die DOM-API und viele der neu verfassten HTML5-APIs bereits standardkonform unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inline Code vs. externe Dateien==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine im Browser angezeigte Web-Seite besteht meist aus HTML, CSS und JavaScript, wobei nur HTML zwingend verlangt ist.&lt;br /&gt;
Der JavaScript-Code kümmert sich normalerweise um die dynamischen Aspekte, wie Interaktionen und das Nachladen von Inhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Browser lädt ein HTML-Dokument unter der angegebenen URL herunter und evaluiert dieses.&lt;br /&gt;
Das Dokument enthält optional Verweise auf CSS-Dateien, Bilder, JavaScript-Dateien und andere Medien.&lt;br /&gt;
Neben Verweisen auf externen JavaScript-Code kann das Dokument auch Inline-Code enthalten.&lt;br /&gt;
Ob es sich um externe Dateien oder Inline-Code handelt wirkt sich auf die Ladezeiten aus,&lt;br /&gt;
der Code selbst wird davon nicht beeinflusst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Reihenfolge der eingebunden Code-Blöcke und angegebenen Dateiverweise ist wichtig,&lt;br /&gt;
da diese ebenso die Reihenfolge der Code-Ausführung darstellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Kontext==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für jede Web-Seite, unabhängig davon ob sie im separaten Fenster oder als Tab angezeigt wird,&lt;br /&gt;
erzeugt der Browser einen separaten isolierten JavaScript-Kontext, in dem Code ausgeführt wird.&lt;br /&gt;
Das bedeutet, dass alle Objekte und Funktionen nur so lange existieren bis die Seite neu geladen oder verlassen wird.&lt;br /&gt;
Ein Zugriff auf andere Seiten ist aus Sicherheitsgründen nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
=Window=&lt;br /&gt;
&lt;br /&gt;
Das globale Objekt &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; referenziert alle im Browser verfügbaren Objekte und Werte als Eigenschaften (native und host).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.Object);&lt;br /&gt;
console.log(window.XMLHttpRequest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf globale Eigenschaften ist es nicht notwendig explizit &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; zu schreiben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Date == window.Date);&lt;br /&gt;
console.log(new Date());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht innerhalb von Funktionen deklarierten Variablen werden automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var globaleVariable = &#039;global&#039;;&lt;br /&gt;
var globaleFunktion = function() {};&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
console.log(window.globaleFunktion);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modifikation von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Da es sich um ein normales Objekt handelt können die meisten Eigenschaften modifiziert und auch gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Veränderungen von globalen Eigenschaften sind nicht sinnvoll und können schwerwiegende Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.Object = {};&lt;br /&gt;
var objekt = new Object();&lt;br /&gt;
&lt;br /&gt;
delete window.Array;&lt;br /&gt;
var array = new Array();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt wird vom Browser mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; erzeugt, welche auch global verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.constructor == window.Window);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Popups und Frames==&lt;br /&gt;
&lt;br /&gt;
Neben dem globalen Fenster-Objekt kann eine Web-Seite beliebig viele weitere &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekte enthalten.&lt;br /&gt;
Dabei handelt es sich dann entweder um durch Code erzeugte Popups oder aber um Frames (besser bekannt als iframes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.open(&#039;https://www.google.com&#039;, &#039;Google im Popup&#039;, &#039;width=400,height=300,resizable=yes&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frames können entweder durch das entsprechende HTML oder aber auch wie im Code gezeigt programmatisch erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
==Browser-Schnittstellen==&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den nativen Objekten notwendigen Objekte enthält &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; wichtige Browser- und Geräte-Schinttstellen.&lt;br /&gt;
Dazu zählen zum Beispiel Funktionen um Dialoge im Browser zu öffnen oder aber sogar um Game-Controller zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = window.prompt(&#039;Wie ist Ihr Name?&#039;);&lt;br /&gt;
window.alert(&#039;Hello &#039; + name);&lt;br /&gt;
window.alert(&#039;Die aktuelle Seite ist &#039; + window.innerWidth + &#039;px breit&#039;);&lt;br /&gt;
&lt;br /&gt;
console.log(window.Gamepad);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Liste der verfügbaren Eigenschaften finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/de/docs/DOM/window dieser] MDN-Seite.&lt;br /&gt;
In den folgenden Abschnitten werden exemplarisch ein paar wichtige Objekte im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Beispiel für Browser-Schnittstellen=&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; ist ein globales Objekt welches die aktuelle URL und ihre Bestandteile enthält und diese auch verändern kann.&lt;br /&gt;
Das Objekt wird analog zum &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt; erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.location.constructor == window.Location);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen der URL===&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; enhtält die gesamte aktuelle URL. Alternativ kann auch &amp;lt;code&amp;gt;location.toString()&amp;lt;/code&amp;gt; genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.href);&lt;br /&gt;
console.log(location.toString());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einzelne Bestandteile der URL ermitteln zu können werden viele separate Eigenschaften bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.protocol);&lt;br /&gt;
console.log(location.host);&lt;br /&gt;
console.log(location.port);&lt;br /&gt;
console.log(location.pathname);&lt;br /&gt;
console.log(location.hash);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verändern der URL===&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften können nicht nur lesend genutzt werden, sondern auch um Änderungen an der aktuellen URL vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Mit der Ausname von &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; führen Änderungen der Eigenschaften zum Verlassen der aktuellen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.protocol = &#039;http&#039;;&lt;br /&gt;
location.port = &#039;8080&#039;;&lt;br /&gt;
location.hash = &#039;#anker&#039;;&lt;br /&gt;
location.href = &#039;https://www.google.com&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es ein paar Funktionen um die URL zu modifizieren oder aber die Seite neuzuladen:&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.assign(&#039;https://www.google.com&#039;);&lt;br /&gt;
location.reload(true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
Das globale &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt;-Objekt ermöglicht den programmatischen Zugriff auf den Browser-Verlauf.&lt;br /&gt;
Es werden Funktionen zur Verfügung gestellt um im Verlauf beliebig viele Schritte zurück und vorwärts zu gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
history.back();&lt;br /&gt;
history.forward();&lt;br /&gt;
history.go(-3);&lt;br /&gt;
history.go(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Aus Sicherheitsgründen ist es nicht erlaubt auf Informationen einzelner Einträge im Verlauf zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
==Navigator==&lt;br /&gt;
&lt;br /&gt;
Für detaillierte Informationen über den aktuellen Client bzw. Browser existiert das &amp;lt;code&amp;gt;navigator&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
Die meistgenutzte Eigenschaft &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; ermöglicht das Feststellen des Browser-Herstellers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(navigator.userAgent);&lt;br /&gt;
console.log(navigator.battery);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Document Object Model=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt können beliebig viele Dokumentenobjekte zugeordnet werden, mindestens aber ein Hauptdokument.&lt;br /&gt;
Das Hauptdokument wird über die globale Variable &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; zur Verfügung gestellt.&lt;br /&gt;
Die Schnittstelle für den Dokumentenzugriff wird durch das [http://www.w3.org/DOM/ Document Object Model] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektmodell==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekt repräsentiert ein vom Browser interpretiertes HTML-Dokument als Objektmodell mit einer Baumstruktur.&lt;br /&gt;
Dabei werden Tags, Texte und Kommentare in Knoten umgewandelt, wobei Tag-Knoten wiederum Unterknoten haben können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
      Text&lt;br /&gt;
      &amp;lt;!-- Kommentar --&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Eingabe&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Markup wird in folgendes Objektmodell übersetzt:&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;html&#039;&#039;&#039;-Knoten mit den Unterknoten &#039;&#039;&#039;head&#039;&#039;&#039; und &#039;&#039;&#039;body&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;head&#039;&#039;&#039;-Knoten mit dem Unterknoten &#039;&#039;&#039;title&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;title&#039;&#039;&#039;-Knoten mit einem Text-Unterknoten&lt;br /&gt;
* Ein &#039;&#039;&#039;body&#039;&#039;&#039;-Knoten mit den Unterknoten &#039;&#039;&#039;p&#039;&#039;&#039; und &#039;&#039;&#039;input&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;p&#039;&#039;&#039;-Knoten mit einem Text- und einem Kommentar-Unterknoten&lt;br /&gt;
* Ein &#039;&#039;&#039;input&#039;&#039;&#039;-Knoten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Achtet man bei HTML auf eine korrekte Einrückung so ist das resultierende Objektmodell meist gut erkennbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Markup-Korrekturen===&lt;br /&gt;
&lt;br /&gt;
Bei dem Objektmodell handelt es sich &#039;&#039;&#039;nicht&#039;&#039;&#039; um exaktes Abbild des originalen Markups.&lt;br /&gt;
Der Unterschied wird klar, wenn man das Resultat von invalidem HTML untersucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Tabelle&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Browser fügt zwischen dem &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;- und dem &amp;lt;code&amp;gt;tr&amp;lt;/code&amp;gt;-Knoten einen &amp;lt;code&amp;gt;tbody&amp;lt;/code&amp;gt;-Knoten ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau von Dokumenten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Node-Objekte===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Knoten innerhalb eines Dokumentenobjekts ist direkt oder indirekt abgeleitet vom &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Konstruktor/-Prototypen.&lt;br /&gt;
Mit Ausnahme des Dokumentenobjekts selbst wird allen Knoten ein Dokument zugeordnet durch die &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;-Eigenschaft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des Weiteren hat jeder Knoten einen numerischen Typen, der in der Eigenschaft &amp;lt;code&amp;gt;nodeType&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
Die gängisten Typen von Dokumentenknoten sind:&lt;br /&gt;
&lt;br /&gt;
* 1: ELEMENT_NODE&lt;br /&gt;
* 3: TEXT_NODE&lt;br /&gt;
* 8: COMMENT_NODE&lt;br /&gt;
* 9: DOCUMENT_NODE&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Referenz der Eigenschaften von Node-Objekten finden Sie auf&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Web/API/Node dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Document-Objekte===&lt;br /&gt;
&lt;br /&gt;
Das Dokument selbst repräsentiert ein abstraktes Dokument und somit kein HTML-Element.&lt;br /&gt;
Es verweist aber auf das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element mit der Eigenschaft &amp;lt;code&amp;gt;documentElement&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe eines Dokuments ist es möglich neue &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekte zu erstellen, einzufügen und diese zu suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Element-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jedes HTML-Tag wird in einen Knoten übersetzt, welcher mit dem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Konstruktor erzeugt wird.&lt;br /&gt;
Element-Objekte besitzen Schnittstellen um auf Eigenschaften des Tags zuzugreifen und diese zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement.tagName);&lt;br /&gt;
console.log(document.documentElement.innerHTML);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie Dokumente können Element-Objekten weitere Node-Objekte als Unterknoten angehängt und nach ihnen gesucht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neue Element-Objekte werden über die Funktion &amp;lt;code&amp;gt;createElement()&amp;lt;/code&amp;gt; eines &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekts unter Angabe des Tag-Namens erzeugt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
console.log(absatz.tagName);&lt;br /&gt;
console.log(absatz.nodeType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung wird das neue Element dem augerufenen Dokument durch die Eigenschaft &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt; als zugehörig markiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var block = document.createElement(&#039;div&#039;);&lt;br /&gt;
console.log(block.ownerDocument);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da die Schnittstelle eines Dokuments nicht mit HTML-Standards gekoppelt ist, können beliebige Tag-Namen vergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinElement = document.createElement(&#039;mein-element&#039;);&lt;br /&gt;
console.log(meinElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Suchen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig bei der Arbeit mit Dokumenten ist die Suche von einzelnen oder mehreren Elementen.&lt;br /&gt;
Aufgrund dessen haben sich die Schnittstellen für die Suche im Browser über die letzten Jahre rapide verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorgefertige Kriterien===&lt;br /&gt;
&lt;br /&gt;
Die ursprünglichen Funktionen zum Suchen von Elementen erlauben wenige festgelegte Kriterien.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeld = document.getElementById(&#039;spielfeld&#039;);&lt;br /&gt;
console.log(spielfeld);&lt;br /&gt;
&lt;br /&gt;
var divElemente = document.getElementsByTagName(&#039;div&#039;);&lt;br /&gt;
console.log(divElemente);&lt;br /&gt;
&lt;br /&gt;
var gegnerElemente = document.getElementsByClassName(&#039;gegner&#039;);&lt;br /&gt;
console.log(gegnerElemente.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Weise können Elemente anhand der ID, Klasse oder des Tag-Namen gesucht werden.&lt;br /&gt;
Der Rückgabewert ist bei der ID-Suche ein &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Objekt und bei den anderen eine &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt;, ein Array-artiges Objekt von Nodes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CSS-Selektoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Suche mithilfe von vorgefertigen Kriterien hat deutliche Limitierungen.&lt;br /&gt;
Deswegen enstand durch Bibliotheken wie jQuery das Konzept von Query-Selektoren, welche als&lt;br /&gt;
[http://www.w3.org/TR/CSS2/selector.html CSS-Selektoren] standardisiert werden und in vielen Browser verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine CSS-Selektorgruppe beschreibt beliebig viele Kriterien, die auf ein oder mehrere HTML-Elemente zutreffen.&lt;br /&gt;
Der Name wurde so gewählt, da diese ebenso in Stylesheets genutzt werden um Elemente auszuwählen.&lt;br /&gt;
Aufgrund der Kombinierbarkeit von CSS-Selektoren ergibt sich eine sehr mächtige Suchfunktionalität.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Funktionen für die Suche mit CSS-Selektoren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelector()&amp;lt;/code&amp;gt; liefert das erste Element zurück welches die Kriterien erfüllt&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelectorAll()&amp;lt;/code&amp;gt; liefert alle Elemente zurück welche die Kriterien erfüllen in Form einer &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Mögliche Kriterien====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das einfachste Kriterium für einen CSS-Selektor ist die Angabe eines Tag-Namen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.querySelectorAll(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Angabe einer ID eines HTML-Elements erfolgt durch eine vorangestellte Raute (&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeldElement = document.querySelector(&#039;#spielfeld&#039;);&lt;br /&gt;
console.log(spielfeldElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Klassen-Selektoren werden durch einen vorangestellten Punkt (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegnerElemente = document.querySelectorAll(&#039;.gegner&#039;);&lt;br /&gt;
console.log(gegnerElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Mächtigkeit von CSS-Selektoren ergibt sich vor allem durch die beliebige Kombinationsmöglichkeiten von Selektoren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var schwierigeGegnerElemente =&lt;br /&gt;
  document.querySelectorAll(&#039;.gegner.schwierig&#039;);&lt;br /&gt;
console.log(schwierigeGegnerElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 1:&#039;&#039;&#039; Die Komplexität einer CSS-Selektorgruppe beeinflusst die Performance einer Suche.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 2:&#039;&#039;&#039; Eine vollständige Erklärung der Funktionsweise von CSS-Selektoren ist nicht Ziel dieses Tutoriums.&lt;br /&gt;
Diese Einführung dient lediglich dazu ein grundsätzliches Verständnis für den Umgang mit Selektoren zu vermitteln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hinzufügen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neu erstellte Elemente können im Dokument als untergeordnete Knoten mithilfe von &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
document.documentElement.appendChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der künftig übergeordnete Knoten muss angesprochen werden, wenn das Element an einer bestimmten Stelle landen soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.querySelector(&#039;div&#039;);&lt;br /&gt;
var spielfeld = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielfeld.appendChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifizieren von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe der entsprechenden DOM-Schnittstellen können Text, HTML, Attribute sowie das Styling von Elementen beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von Text und HTML===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der gesamte HTML-Inhalt eines Elements kann mithilfe der Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;Hallo Welt&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von einfachen Text-Änderungen lässt sich sogar das gesamte enthaltene HTML beeinflussen.&lt;br /&gt;
Anstatt also mit der DOM-API einzelne Elemente zu erzeugen kann einfach Markup als Wert zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;p&amp;gt;Hallo &amp;lt;strong&amp;gt;Welt!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von Attributen===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die Attribute eines HTML-Elements gibt es die Funktionen &amp;lt;code&amp;gt;getAttribute()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Beide akzeptieren als erstes Argument den Namen des Attributs, der Setter akzeptiert außerdem einen zu setzenden Wert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielerElement.innerHTML = &#039;_|_&#039;;&lt;br /&gt;
spielerElement.setAttribute(&#039;class&#039;, &#039;spieler&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(spielerElement);&lt;br /&gt;
&lt;br /&gt;
console.log(spielerElement.getAttribute(&#039;class&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Besonders häufige Attributsänderungen sind das Hinzufügen und/oder Entfernen von Klassen.&lt;br /&gt;
Dafür gibt es in neueren Browsern die Liste &amp;lt;code&amp;gt;classList&amp;lt;/code&amp;gt; auf jedem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt, welche die Arbeit erleichtert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
spielerElement.classList.add(&#039;unbesiegbar&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von CSS-Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neben dem Document Object Model existiert außerdem der [http://dev.w3.org/csswg/cssom/ CSS Object Model Standard]&lt;br /&gt;
welcher die Schnittstelle für den Zugriff auf CSS-Eigenschaften von DOM-Objekten standardisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein jedes DOM-Element vom Typ &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; besitzt eine Eigenschaft &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; welche alle CSS-Eigenschaften beherbergt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
console.log(body.style.color);&lt;br /&gt;
console.log(body.style.padding);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften spiegeln die in Stylesheets definierten Regeln wieder, jedoch inklusive dem kaskadierenden Charakter.&lt;br /&gt;
Das heisst dass ein Element-Objekt nicht zwingend selbst eine &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; besitzt, diese jedoch für die Anzeige vererbt bekommt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften können ebenso beliebig modifiziert werden, was zu einer sofortigen Anpassung der Darstellung führt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.style.backgroundColor = &#039;#AAF&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie neue Elemente einem Dokument hinzugefügt werden können, so können diese oder bestehende auch gelöscht werden.&lt;br /&gt;
Dazu muss man den übergeordneten Knoten ansteuern und mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt; die Entfernung durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeld = document.querySelector(&#039;.spielfeld&#039;);&lt;br /&gt;
var spielerElement = spielfeld.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
spielfeld.removeChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist einem der übergeordnete Knoten nicht bekannt so kann diesen mithilfe der Knotenverweise ermitteln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var entferneKnoten = function(knoten) {&lt;br /&gt;
  if (!knoten.parentNode) {&lt;br /&gt;
    throw new Error(&#039;no parent node&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  knoten.parentNode.removeChild(knoten);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spielerElement = document.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
entferneKnoten(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=DOM Events=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisorientierte Programmierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für die Verarbeitung von stets verfügbaren Informationen eignet sich ein sequentieller Ablauf von Befehlen.&lt;br /&gt;
Ergeben sich Informationen jedoch dynamisch zur Laufzeit kann die ereignisorientierte Programmierung genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Hierbei wird nicht aktiv auf eine Information gewartet, das Programm wird benachrichtigt wenn ein Ereignis eintritt.&lt;br /&gt;
Somit gibt es nicht nur einen Kontrollfluss, sondern beliebig viele, welche sogar parallel ablaufen können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisse im Browser==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Interaktion mit Websites werden viele Ereignisse ausgelöst.&lt;br /&gt;
Zuerst wird die HTML-Seite geladen und gerendert, danach geschieht dies für alle referenzierten Inhalte.&lt;br /&gt;
Diese Vorgänge lösen Ereignisse aus, welche durch den Browser selbst verursacht werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel gibt es Ereignisse für Medien, welche beschreiben, dass diese fertig geladen wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald der Browser beginnt eine Web-Seite zu rendern können Ereignisse durch den Benutzer ausgelöst werden.&lt;br /&gt;
Fast jede Interaktion löst ein Ereignis aus, welches wiederum in bestimmten Reaktionen resultiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
Klickt der Benutzer einen Link so ist das ein Ereignis, welches zur Folge hat dass die eine URL geladen wird.&lt;br /&gt;
Wird ein Scroll-Balken bewegt ergibt sich daraus ein Ereignis, welches den Browser scrollen lässt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zu den wichtigsten Arten von durch Benutzer ausgelöste Ereignissen zählen:&lt;br /&gt;
Mausbewegungen und -klicks, Tastatureingaben und Scrolling.&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Auflistung von Ereignissen finden Sie auf [https://developer.mozilla.org/en-US/docs/Web/Events dieser] MDN-Seite.&lt;br /&gt;
Nebem dem Benutzer gibt es noch andere Auslöser wie zum Beispiel verbundene Server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau eines Ereignisses==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein im Browser auftretendes Ereignis besitzt immer drei folgende Merkmale:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Name:&#039;&#039;&#039; eine Zeichenkette die das Ereignis in der Gegenwart beschreibt, z.B. &amp;quot;click&amp;quot; oder &amp;quot;mousemove&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Daten:&#039;&#039;&#039; ein Datenobjekt mit einer pro Ereignis festgelegten Struktur&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Ziel:&#039;&#039;&#039; ein Objekt das als Ziel des Ereignis gilt; in der Regel handelt es sich um DOM-Elemente&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine &#039;&#039;&#039;Tastatureingabe&#039;&#039;&#039; in einem &#039;&#039;&#039;Formularfeld&#039;&#039;&#039;, bei dem das Zeichen &#039;&#039;&#039;@&#039;&#039;&#039; eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Phasen der Ereignispropagierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei dem ursprünglichen Ziel eines Ereignisses um ein DOM-Objekt werden in der Regel drei Phasen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Capturing-Phase===&lt;br /&gt;
&lt;br /&gt;
In Phase 1, der &#039;&#039;&#039;Capturing-Phase&#039;&#039;&#039;, wird ein Ereignis mit dem obersten Dokumentenknoten als Ziel ausgelöst.&lt;br /&gt;
Dabei handelt es sich in der Regel um das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt, welches alle andere Nodes als Unterknoten enthält.&lt;br /&gt;
Es werden dann schrittweise Ereignisse ausgelöst für jeden Unterknoten auf dem Pfad zum ursprünglichen Ereignisziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
+ window      - Ereignis mit window als aktuelles Ziel (optional)&lt;br /&gt;
  + document  - Ereignis mit body als aktuelles Ziel&lt;br /&gt;
    + body    - Ereignis mit body als aktuelles Ziel&lt;br /&gt;
      + p     - ursprüngliches Ziel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Bei manchen Ereignissen ist &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; das oberste Objekt in der Hierarchie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Target-Phase===&lt;br /&gt;
&lt;br /&gt;
Ist der Browser beim ursprünglichen Ziel angelangt wird in Phase 2 gewechselt, der sogenannten &#039;&#039;&#039;Target-Phase&#039;&#039;&#039;.&lt;br /&gt;
Dabei wird ein einzelnes Ereignis ausgelöst, für welches das ursprüngliche DOM-Objekt als Ziel verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bubbling-Phase===&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss der Ereignispropagierung wechselt der Browser in Phase 3, der sogenannten &#039;&#039;&#039;Bubbling-Phase&#039;&#039;&#039;.&lt;br /&gt;
Hierbei wird der Pfad der Capturing-Phase in umgekehrter Richtung durchlaufen und jeweils wieder ein Ereignis ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In Bibliotheken wie jQuery hat man nur Zugriff auf die Bubbling-Phase, nicht auf die Capturing-Phase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Browser-Unterschiede===&lt;br /&gt;
&lt;br /&gt;
Capturing und Bubbling bilden die Tatsache ab, dass wenn ein Ereignis auf einem Element stattfindet,&lt;br /&gt;
dieses Ereignis ebenso für die übergeordneten Elemente gültig ist.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wird ein Mensch in einem Krankenhaus geboren, so wird er auch in einer Stadt und in einem Land geboren.&lt;br /&gt;
&lt;br /&gt;
Einer der beiden Phasen wäre ausreichend für die Ereignisvearbeitung.&lt;br /&gt;
Aufgrund von unterschiedlichen Browser-Implementierungen existieren heutzutage jedoch beide gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Globale Ereignisse===&lt;br /&gt;
&lt;br /&gt;
Beschreibt ein Ereignis ein globales Geschehen wird oftmals das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als Ereignisziel verwendet.&lt;br /&gt;
In diesen Fällen ist es möglich dass weder Capturing- noch eine Bubbling-Phase durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Ergeinis &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; beschreibt, dass eine Seite (ohne seine externen Medien) fertig geladen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe der DOM-Schnittstelle erhält man die Möglichkeit Ereignisse selbst zu verarbeiten und darauf zu reagieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anmeldung===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt; kann auf jedem DOM-Objekt, dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt und dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt aufgerufen werden.&lt;br /&gt;
Dabei ist das Objekt auf dem die Funktion aufgerufen das &#039;&#039;&#039;Ziel&#039;&#039;&#039; des Ereignisses, welches verarbeiten werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion akzeptiert die folgenden drei Argumente:&lt;br /&gt;
* den &#039;&#039;&#039;Namen des Ereignisses&#039;&#039;&#039; das man verarbeiten möchte in Form eines Strings&lt;br /&gt;
* die &#039;&#039;&#039;Callback-Funktion&#039;&#039;&#039; welche das Ereignis-Objekt erwartet und den Code zur Verarbeitung enthält&lt;br /&gt;
* ein optionales &#039;&#039;&#039;Flag&#039;&#039;&#039; das bestimmt ob das Ereignis in der Capturing- oder Bubbling-Phase verarbeitet werden soll&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist das Flag &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, was bedeutet dass das Ereignis in der Bubbling-Phase verarbeitet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es wird für ein Ereignis auf einem Ziel ein Event-Lister in Form einer Funktion angemeldet.&lt;br /&gt;
Beim Eintreten des Ereignisses wird der sogenannte Callback aufgerufen und das entsprechende Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var seiteWurdeGeladen = function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite ist nun fertig geladen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
}&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, seiteWurdeGeladen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;a id=&amp;quot;link&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
var link = document.querySelector(&#039;#link&#039;);&lt;br /&gt;
var linkWurdeGeklickt = function(event) {&lt;br /&gt;
  console.log(&#039;Der Link wurde geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
link.addEventListener(&#039;click&#039;, linkWurdeGeklickt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Phasen der Ereignispropagierung kann man Ereignisse global verarbeiten, unabhängig davon wo sie stattgefunden haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
var irgendwoWurdeGeklickt = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat irgendwo auf der Seite geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;click&#039;, irgendwoWurdeGeklickt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Callback ist eine Rückruffunktion, welche an ein andere Funktion übergeben wird und&lt;br /&gt;
zu späteren Zeitpunkten ggf. ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mausWurdeBewegt = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist jedoch nicht garantiert dass eine übergebene Callback-Funktion überhaupt jemals ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var esIstOktober = function(event) {&lt;br /&gt;
  console.log(&#039;Es ist Oktober&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var istEsOktober = function(callback) {&lt;br /&gt;
  if (new Date().getMonth() == 9) callback();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
istEsOktober(esIstOktober);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ereignis-Objekte===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedem Event-Listener-Callback wird beim Aufruf ein für ein Ereignis spezifisches Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
  console.log(event.screenX);&lt;br /&gt;
  console.log(event.screenY);&lt;br /&gt;
  console.log(event.button);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieses Objekt enthält neben spezifischen auch generelle Ereignisinformationen wie zum Beispiel das Ereignis-Ziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich der drei Event-Phasen unterscheidet man zwischen ursprünglichem und aktuellem Ziel.&lt;br /&gt;
Das aktuelle Ziel ist das für welches das Ereignis aktuell gilt und das ursprüngliche das wo es stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target); // ursprüngliches Ziel&lt;br /&gt;
  console.log(event.currentTarget); // aktuelles Ziel&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Ziel &amp;lt;code&amp;gt;currentTarget&amp;lt;/code&amp;gt; entspricht also immer dem Objekt auf dem man den Event-Handler angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abmeldung===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;removeEventListener&amp;lt;/code&amp;gt; kann ein angemeldeter Event-Listener wieder entfernt werden.&lt;br /&gt;
Diese Funktion nur zwei Argumente: Den Ereignis-Namen und die Event-Listener-Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mausWurdeBewegt = function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
document.removeEventListener(&#039;mousemove&#039;, mausWurdeBewegt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Standardverhalten===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nachdem alle Ereignisse verarbeitet wurden führt der Browser gegegebenfalls eine &amp;quot;Default Action&amp;quot; aus.&lt;br /&gt;
Eine solche Aktion ist das Standardverhalten des Browsers als Reaktion auf das eingetretene Ereignis.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Benutzer klickt auf einen Link -&amp;gt; der Browser lädt die URL&lt;br /&gt;
* Benutzer führt Tastatureingaben in einem Feld aus -&amp;gt; der Browser fügt die Zeichen dem Feld hinzu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Event-Listener-Funktion ist es möglich mithilfe von &amp;lt;code&amp;gt;preventDefault()&amp;lt;/code&amp;gt; das Standardverhalten zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
      event.preventDefault();&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben dargestellte Code führt dazu, dass kein Klick auf einen Link die enthaltene URL aufruft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wichtige Events==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse sind die wichtigsten in der täglichen browser-seitingen Anwendungsentwicklung mit JavaScript.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===DOMContentLoaded===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis beschreibt, dass das HTML geladen und interpretiert wurde und das DOM und CSSOM erzeugt und gerendert wurde.&lt;br /&gt;
Es wird keine Aussage darüber gemacht ob weitere externe Inhalte bereits geladen wurden, wie z.B. Bilder.&lt;br /&gt;
Das Ereignis wird ausschliesslich auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt als Ereignisziel ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Mit der Seite kann interagiert werden&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===load===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis besagt, dass die gesamte Web-Seite inklusive aller externen referenziereten Inhalte gerendert wurden.&lt;br /&gt;
Im Gegensatz zu &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; wird dieses Ereignis ausschliesslich auf dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&#039;load&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite wurde vollständig geladen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===click===&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn der Benutzer (mit der Maus) auf ein sichtbares DOM-Element klickt wird dieses Ereignis ausgelöst.&lt;br /&gt;
Bei der Propagierung dieses Ereignisses werden wie alle drei Ereignisphasen (Capturing, Bubbling, Target) durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat auf etwas geklickt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===mousemove, mouseover, mouseout===&lt;br /&gt;
&lt;br /&gt;
Bei Mausbewegungen über DOM-Element wird konstant das Ereignis &amp;lt;code&amp;gt;mousemove&amp;lt;/code&amp;gt; mit den entsprechenden Koordinaten ausgelöst.&lt;br /&gt;
Das Ereignis &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt; wird erzeugt wenn die Maus in ein Element eindringt, &amp;lt;code&amp;gt;mouseout&amp;lt;/code&amp;gt; wenn es wieder verlassen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseover&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus über etwas bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseout&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus von etwas weg bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===keydown, keyup, keypress===&lt;br /&gt;
&lt;br /&gt;
Bei Tastatureingaben durch Benutzer auf einem Element werden die Ereignisse &amp;lt;code&amp;gt;keydown&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;keypress&amp;lt;/code&amp;gt; ausgelöst.&lt;br /&gt;
Die drei unterschiedlichen Ereignisse beschreiben die unterschiedlichen Phasen einer Tastatureingabe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;keydown&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste gedrückt&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keypress&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste betätigt&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keyup&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste losgelassen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von DOM Events kann auch ein genereller Event-Mechanismus für JavaScript implementiert werden.&lt;br /&gt;
Dazu wird ein DOM-Element erzeugt, welches als virtuelles Ereignisziel dient und nicht ins Dokument eingehängt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var EventDispatcher = function() {&lt;br /&gt;
&lt;br /&gt;
  var target = document.createElement(&#039;div&#039;);&lt;br /&gt;
&lt;br /&gt;
  this.addEventListener = function(type, callback) {&lt;br /&gt;
    target.addEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.dispatchEvent = function(type, detail) {&lt;br /&gt;
    var event = new CustomEvent(type, {&lt;br /&gt;
      bubbles: true,&lt;br /&gt;
      canceable: true,&lt;br /&gt;
      detail: detail&lt;br /&gt;
    });&lt;br /&gt;
    target.dispatchEvent(event);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.removeEventListener = function(type, callback) {&lt;br /&gt;
    target.removeEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Klasse kann dann in beliebigen anderen Komponenten dazu genutzt werden um Ereignisse zu erzeugen und zu propagieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.eventDispatcher = new EventDispatcher();&lt;br /&gt;
&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    this.eventDispatcher.dispatchEvent(&#039;springen&#039;, this);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.wennSpielerSpringt = function(callback) {&lt;br /&gt;
    this.eventDispatcher.addEventListener(&#039;springen&#039;, callback);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler.wennSpielerSpringt(function() {&lt;br /&gt;
  console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
});&lt;br /&gt;
spieler.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Timer=&lt;br /&gt;
&lt;br /&gt;
Timer in JavaScript dienen dazu um CPU-intensive Berechnungen in mehrere Teile zu spalten und um Animation zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Thread==&lt;br /&gt;
&lt;br /&gt;
Der Browser stellt für jede dargestellte Web-Seite einen einzelnen Thread zur Verfügung.&lt;br /&gt;
Dieser kümmert sich um das Rendering der Web-Seite, die Verarbeitung von Events und die Ausführung von JavaScript.&lt;br /&gt;
Mit Ausnahme des HTML5-Standards der WebWorker gibt es dementsprechend in JavaScript kein Multithreading.&lt;br /&gt;
&lt;br /&gt;
Intern bestitzt der Thread eine Liste an Aufgaben die er stets als nächstes ausführen wird, der sogenannten Queue.&lt;br /&gt;
Wird eine Web-Seite zum ersten Mal geladen verursacht dies gleich mehrere Einträge in der Queue, wie zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
* Parsen des Markups und Aufbau des DOMs&lt;br /&gt;
* Parsen des CSS und Aufbau des CSSOMs&lt;br /&gt;
* Rendering der Seite&lt;br /&gt;
* Ausführung von geladenem JavaScript-Code&lt;br /&gt;
&lt;br /&gt;
Manche Aufgaben benötigen unter Umständen viel Zeit und können so auch die Ausführung anderer Aufgaben beeinflussen.&lt;br /&gt;
Nimmt ein Stück JavaScript-Code die CPU zu lange in Anspruch kann der Browser z.B. keine Benutzereingaben mehr vearbeiten.&lt;br /&gt;
Um dies zu vermeiden ist ein Zeit- bzw. Code-Limit für JavaScript eingebaut bevor der Browser eine Warnung ausgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var wartezeitInMs = 5000;  &lt;br /&gt;
while (new Date() - programmStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Timeouts==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;setTimeout(callback, delayMs)&amp;lt;/code&amp;gt; kann man einen einmalig auszuführenden Timer auf der Thread-Queue anmelden.&lt;br /&gt;
Die übergebene Callback-Funktion wird &#039;&#039;&#039;ungefähr&#039;&#039;&#039; nach einer Wartezeit mit Länge der übergebenen Dauer ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Es werden Einträge in der Thread-Queue erzeugt die überprüfen ob es Zeit ist den Callback auszuführen und das dann ggf. tun.&lt;br /&gt;
Aufgrund der vielen Aufgaben des Threads kann die Wartezeit überschritten werden, wenn andere Aufgaben viel Zeit beanspruchen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(&#039;Nachricht &#039; + vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 500);&lt;br /&gt;
while (new Date() - programmStart &amp;lt; 1000) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Wartezeit von 0 Millisekunden heißt, dass der Interpreter die Callback-Funktion so bald wie möglich ausführen soll. &lt;br /&gt;
Abhängig von der Browser-Implementierung kann es sein dass die minimale Wartezeit aber bis zu 15 Millisekunden beträgt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(&#039;Nachricht &#039; + vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist möglich mit Timern CPU-intensive Aufgaben in mehrere Teile zu spalten oder auch Aufgaben wiederholt auszuführen.&lt;br /&gt;
Dazu erzeugt man einfach eine Funktion welche sich wiederum selbst durch einen &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt;-Aufruf als Timer registriert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll die wiederholte Ausführung beendet werden kann dies durch einen Aufruf von &amp;lt;code&amp;gt;clearTimeout(timeoutId)&amp;lt;/code&amp;gt; erreicht werden.&lt;br /&gt;
Dabei wird der Eintrag mit gegebener Timeout-ID aus der Thread-Queue gelöscht wodurch der angemeldete Timer nicht ausgeführt wird.&lt;br /&gt;
Die notwendige Timeout-ID für die Abmeldung wird beim Anmelden durch &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; als numerischer Rückgabewert bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var timeoutId = null;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  timeoutId = setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearTimeout(timeoutId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; eignet sich vor allem für wiederholende Aufgaben welche nichts mit Rendering zu tun haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Intervalle==&lt;br /&gt;
&lt;br /&gt;
Außerdem existiert die Funktion &amp;lt;code&amp;gt;setInterval(callback, delayMs)&amp;lt;/code&amp;gt; welche einen wiederholt auszuführenden Timer regsitriert.&lt;br /&gt;
Es wird ebenso eine Callback-Funktion erwartet und eine Wartezeit zwischen den einzelnen Ausführungen des Callbacks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; wird eine Interval-ID zurückgegeben, welche für die Abmeldung mittels &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
var intervalId = setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearInterval(intervalId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst wirkt &amp;lt;code&amp;gt;setInterval()&amp;lt;/code&amp;gt; komfortabler, da der Callback nicht durch die wiederholende Timer-Registrierung verunreinigt wird.&lt;br /&gt;
Jedoch besteht bei dieser Funktion der Nachteil dass die Messung der Wartezeit &#039;&#039;&#039;vor&#039;&#039;&#039; Ausführung des Callbacks beginnt.&lt;br /&gt;
Registriert man eine Aufgabe die länger braucht als die definierte Wartezeit wird der JavaScript-Thread sehr stark beansprucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var warteEineBestimmeZeit = function() {&lt;br /&gt;
  var funktionsStart = new Date();&lt;br /&gt;
  var wartezeitInMs = 50;&lt;br /&gt;
  while (new Date() - funktionsStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
    // nichts tun&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
setInterval(warteEineBestimmeZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obwohl der Browser zwar noch CPU-Zeit zur Verfügung hat ist er fast nur damit beschäftigt die überfälligen Callbacks auszuführen.&lt;br /&gt;
Aufgrund dessen ist es sinnvoller &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; für wiederholende Aufgaben zu verwenden deren Dauer nicht exakt vorhersehbar ist.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der vielen verschiedenen Aufgaben des JavaScript-Threads ist eine exakte Wartezeit bei Timern nicht garantiert.&lt;br /&gt;
Sollen Werte abhängig von der vergangenen Zeit verändern sollten Datum-Objekte in die Berechnungen mit einbezogen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var objekt = {position: 0, geschwindigkeitProSekunde: 1};&lt;br /&gt;
var letzterTimerAufruf = new Date();&lt;br /&gt;
var bewegeObjekt = function() {&lt;br /&gt;
  var vergangeneZeitInMs = new Date() - letzterTimerAufruf;&lt;br /&gt;
  objekt.position += geschwindigkeitProSekunde * (vergangeneZeitInMs / 1000);&lt;br /&gt;
  console.log(&#039;Aktuelle Position: &#039; + objekt.position);&lt;br /&gt;
  letzterTimerAufruf = new Date();&lt;br /&gt;
  setTimeout(bewegeObjekt, 1000);&lt;br /&gt;
};&lt;br /&gt;
bewegeObjekt();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Frames==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; ist es möglich neben wiederholenden Aufgaben auch Animationen im Browser zu implementieren.&lt;br /&gt;
Dazu werden in der Callback-Funktion einfach die zu bewegenden Elemente entsprechend in ihrer Form und Position verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
div.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeRechteck = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  div.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  setTimeout(bewegeRechteck, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeRechteck();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird versucht dass Rechteck ca. 60 Mal in der Sekunde zu bewegen, also eine Bildwiederholrate von 60 simuliert.&lt;br /&gt;
Es kann allerdings vorkommen dass der Browser viele anderen Dingen zu tun hat und ihn ein solcher Timer zusätzlich sehr beansprucht.&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es speziell für Animationen und visuelle Änderungen die Funktion &amp;lt;code&amp;gt;requestAnimationFrame(callback)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese erwartet lediglich einen Callback und kümmert sich intern darum wann der Callback das nächste Mal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
div.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeRechteck = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  div.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  requestAnimationFrame(bewegeRechteck, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeRechteck();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;clearTimeout()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; gibt es die Funktion &amp;lt;code&amp;gt;cancelAnimationFrame(frameId)&amp;lt;/code&amp;gt; für die Abmeldung.&lt;br /&gt;
Diese akzeptiert eine Frame-ID welche wiederum von &amp;lt;code&amp;gt;requestAnimationFrame()&amp;lt;/code&amp;gt; zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist empfehlenswert Animation mit &amp;lt;code&amp;gt;requestAnimationFrame&amp;lt;/code&amp;gt; zu implementieren.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38264</id>
		<title>JavaScript-Tutorium:Browser</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38264"/>
		<updated>2015-10-14T21:54:39Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Document Object Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten bei der JavaScript-Entwicklung im Browser zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Einführung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Native vs. Host==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer JavaScript-Umgebung existieren zwei Arten von Objekte.&lt;br /&gt;
&#039;&#039;&#039;Native Objekte&#039;&#039;&#039; werden von der Engine bereitgestellt und sind durch den ECMAScript-Standard abgedeckt.&lt;br /&gt;
&#039;&#039;&#039;Host-Objekte&#039;&#039;&#039; sind nicht immer standardisiert und werden von der Umgebung bereitgestellt.&lt;br /&gt;
Im Browser handelt es sich bei Host-Objekten um Schnittstellen für den Zugriff auf den Browser und externe Geräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==HTML5-Standard==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Obwohl es den ECMAScript-Standard gibt, muss man davon ausgehen,&lt;br /&gt;
dass sich die verfügbaren APIs von Browser zu Browser unterscheiden können.&lt;br /&gt;
Durch die steigende Entwicklungsgeschwindigkeit der Browser-Hersteller und den&lt;br /&gt;
[https://html.spec.whatwg.org/multipage/ HTML5-Standard] verbessert sich diese Situation.&lt;br /&gt;
&lt;br /&gt;
Heutzutage kann man davon ausgehen, dass jeweils die neuesten Versionen von Firefox und Chrome&lt;br /&gt;
die DOM-API und viele der neu verfassten HTML5-APIs bereits standardkonform unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inline Code vs. externe Dateien==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine im Browser angezeigte Web-Seite besteht meist aus HTML, CSS und JavaScript, wobei nur HTML zwingend verlangt ist.&lt;br /&gt;
Der JavaScript-Code kümmert sich normalerweise um die dynamischen Aspekte, wie Interaktionen und das Nachladen von Inhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Browser lädt ein HTML-Dokument unter der angegebenen URL herunter und evaluiert dieses.&lt;br /&gt;
Das Dokument enthält optional Verweise auf CSS-Dateien, Bilder, JavaScript-Dateien und andere Medien.&lt;br /&gt;
Neben Verweisen auf externen JavaScript-Code kann das Dokument auch Inline-Code enthalten.&lt;br /&gt;
Ob es sich um externe Dateien oder Inline-Code handelt wirkt sich auf die Ladezeiten aus,&lt;br /&gt;
der Code selbst wird davon nicht beeinflusst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Reihenfolge der eingebunden Code-Blöcke und angegebenen Dateiverweise ist wichtig,&lt;br /&gt;
da diese ebenso die Reihenfolge der Code-Ausführung darstellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Kontext==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für jede Web-Seite, unabhängig davon ob sie im separaten Fenster oder als Tab angezeigt wird,&lt;br /&gt;
erzeugt der Browser einen separaten isolierten JavaScript-Kontext, in dem Code ausgeführt wird.&lt;br /&gt;
Das bedeutet, dass alle Objekte und Funktionen nur so lange existieren bis die Seite neu geladen oder verlassen wird.&lt;br /&gt;
Ein Zugriff auf andere Seiten ist aus Sicherheitsgründen nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
=Window=&lt;br /&gt;
&lt;br /&gt;
Das globale Objekt &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; referenziert alle im Browser verfügbaren Objekte und Werte als Eigenschaften (native und host).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.Object);&lt;br /&gt;
console.log(window.XMLHttpRequest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf globale Eigenschaften ist es nicht notwendig explizit &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; zu schreiben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Date == window.Date);&lt;br /&gt;
console.log(new Date());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht innerhalb von Funktionen deklarierten Variablen werden automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var globaleVariable = &#039;global&#039;;&lt;br /&gt;
var globaleFunktion = function() {};&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
console.log(window.globaleFunktion);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modifikation von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Da es sich um ein normales Objekt handelt können die meisten Eigenschaften modifiziert und auch gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Veränderungen von globalen Eigenschaften sind nicht sinnvoll und können schwerwiegende Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.Object = {};&lt;br /&gt;
var objekt = new Object();&lt;br /&gt;
&lt;br /&gt;
delete window.Array;&lt;br /&gt;
var array = new Array();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt wird vom Browser mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; erzeugt, welche auch global verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.constructor == window.Window);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Popups und Frames==&lt;br /&gt;
&lt;br /&gt;
Neben dem globalen Fenster-Objekt kann eine Web-Seite beliebig viele weitere &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekte enthalten.&lt;br /&gt;
Dabei handelt es sich dann entweder um durch Code erzeugte Popups oder aber um Frames (besser bekannt als iframes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.open(&#039;https://www.google.com&#039;, &#039;Google im Popup&#039;, &#039;width=400,height=300,resizable=yes&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frames können entweder durch das entsprechende HTML oder aber auch wie im Code gezeigt programmatisch erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
==Browser-Schnittstellen==&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den nativen Objekten notwendigen Objekte enthält &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; wichtige Browser- und Geräte-Schinttstellen.&lt;br /&gt;
Dazu zählen zum Beispiel Funktionen um Dialoge im Browser zu öffnen oder aber sogar um Game-Controller zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = window.prompt(&#039;Wie ist Ihr Name?&#039;);&lt;br /&gt;
window.alert(&#039;Hello &#039; + name);&lt;br /&gt;
window.alert(&#039;Die aktuelle Seite ist &#039; + window.innerWidth + &#039;px breit&#039;);&lt;br /&gt;
&lt;br /&gt;
console.log(window.Gamepad);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Liste der verfügbaren Eigenschaften finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/de/docs/DOM/window dieser] MDN-Seite.&lt;br /&gt;
In den folgenden Abschnitten werden exemplarisch ein paar wichtige Objekte im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Beispiel für Browser-Schnittstellen=&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; ist ein globales Objekt welches die aktuelle URL und ihre Bestandteile enthält und diese auch verändern kann.&lt;br /&gt;
Das Objekt wird analog zum &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt; erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.location.constructor == window.Location);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen der URL===&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; enhtält die gesamte aktuelle URL. Alternativ kann auch &amp;lt;code&amp;gt;location.toString()&amp;lt;/code&amp;gt; genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.href);&lt;br /&gt;
console.log(location.toString());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einzelne Bestandteile der URL ermitteln zu können werden viele separate Eigenschaften bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.protocol);&lt;br /&gt;
console.log(location.host);&lt;br /&gt;
console.log(location.port);&lt;br /&gt;
console.log(location.pathname);&lt;br /&gt;
console.log(location.hash);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verändern der URL===&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften können nicht nur lesend genutzt werden, sondern auch um Änderungen an der aktuellen URL vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Mit der Ausname von &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; führen Änderungen der Eigenschaften zum Verlassen der aktuellen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.protocol = &#039;http&#039;;&lt;br /&gt;
location.port = &#039;8080&#039;;&lt;br /&gt;
location.hash = &#039;#anker&#039;;&lt;br /&gt;
location.href = &#039;https://www.google.com&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es ein paar Funktionen um die URL zu modifizieren oder aber die Seite neuzuladen:&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.assign(&#039;https://www.google.com&#039;);&lt;br /&gt;
location.reload(true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
Das globale &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt;-Objekt ermöglicht den programmatischen Zugriff auf den Browser-Verlauf.&lt;br /&gt;
Es werden Funktionen zur Verfügung gestellt um im Verlauf beliebig viele Schritte zurück und vorwärts zu gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
history.back();&lt;br /&gt;
history.forward();&lt;br /&gt;
history.go(-3);&lt;br /&gt;
history.go(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Aus Sicherheitsgründen ist es nicht erlaubt auf Informationen einzelner Einträge im Verlauf zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
==Navigator==&lt;br /&gt;
&lt;br /&gt;
Für detaillierte Informationen über den aktuellen Client bzw. Browser existiert das &amp;lt;code&amp;gt;navigator&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
Die meistgenutzte Eigenschaft &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; ermöglicht das Feststellen des Browser-Herstellers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(navigator.userAgent);&lt;br /&gt;
console.log(navigator.battery);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Document Object Model=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt können beliebig viele Dokumentenobjekte zugeordnet werden, mindestens aber ein Hauptdokument.&lt;br /&gt;
Das Hauptdokument wird über die globale Variable &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; zur Verfügung gestellt.&lt;br /&gt;
Die Schnittstelle für den Dokumentenzugriff wird durch das [http://www.w3.org/DOM/ Document Object Model] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektmodell==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekt repräsentiert ein vom Browser interpretiertes HTML-Dokument als Objektmodell mit einer Baumstruktur.&lt;br /&gt;
Dabei werden Tags, Texte und Kommentare in Knoten umgewandelt, wobei Tag-Knoten wiederum Unterknoten haben können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
      Text&lt;br /&gt;
      &amp;lt;!-- Kommentar --&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Eingabe&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Markup wird in folgendes Objektmodell übersetzt:&lt;br /&gt;
&lt;br /&gt;
* Ein &#039;&#039;&#039;html&#039;&#039;&#039;-Knoten mit den Unterknoten &#039;&#039;&#039;head&#039;&#039;&#039; und &#039;&#039;&#039;body&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;head&#039;&#039;&#039;-Knoten mit dem Unterknoten &#039;&#039;&#039;title&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;title&#039;&#039;&#039;-Knoten mit einem Text-Unterknoten&lt;br /&gt;
* Ein &#039;&#039;&#039;body&#039;&#039;&#039;-Knoten mit den Unterknoten &#039;&#039;&#039;p&#039;&#039;&#039; und &#039;&#039;&#039;input&#039;&#039;&#039;&lt;br /&gt;
* Ein &#039;&#039;&#039;p&#039;&#039;&#039;-Knoten mit einem Text- und einem Kommentar-Unterknoten&lt;br /&gt;
* Ein &#039;&#039;&#039;input&#039;&#039;&#039;-Knoten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Achtet man bei HTML auf eine korrekte Einrückung so ist das resultierende Objektmodell meist gut erkennbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Markup-Korrekturen===&lt;br /&gt;
&lt;br /&gt;
Bei dem Objektmodell handelt es sich &#039;&#039;&#039;nicht&#039;&#039;&#039; um exaktes Abbild des originalen Markups.&lt;br /&gt;
Der Unterschied wird klar, wenn man das Resultat von invalidem HTML untersucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Tabelle&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Browser fügt zwischen dem &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;- und dem &amp;lt;code&amp;gt;tr&amp;lt;/code&amp;gt;-Knoten einen &amp;lt;code&amp;gt;tbody&amp;lt;/code&amp;gt;-Knoten ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau von Dokumenten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Node-Objekte===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Knoten innerhalb eines Dokumentenobjekts ist direkt oder indirekt abgeleitet vom &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Konstruktor/-Prototypen.&lt;br /&gt;
Mit Ausnahme des Dokumentenobjekts selbst wird allen Knoten ein Dokument zugeordnet durch die &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;-Eigenschaft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des Weiteren hat jeder Knoten einen numerischen Typen, der in der Eigenschaft &amp;lt;code&amp;gt;nodeType&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
Die gängisten Typen von Dokumentenknoten sind:&lt;br /&gt;
&lt;br /&gt;
* 1: ELEMENT_NODE&lt;br /&gt;
* 3: TEXT_NODE&lt;br /&gt;
* 8: COMMENT_NODE&lt;br /&gt;
* 9: DOCUMENT_NODE&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Referenz der Eigenschaften von Node-Objekten finden Sie auf&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Web/API/Node dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Document-Objekte===&lt;br /&gt;
&lt;br /&gt;
Das Dokument selbst repräsentiert ein abstraktes Dokument und somit kein HTML-Element.&lt;br /&gt;
Es verweist aber auf das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element mit der Eigenschaft &amp;lt;code&amp;gt;documentElement&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe eines Dokuments ist es möglich neue &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekte zu erstellen, einzufügen und diese zu suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Element-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jedes HTML-Tag wird in einen Knoten übersetzt, welcher mit dem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Konstruktor erzeugt wird.&lt;br /&gt;
Element-Objekte besitzen Schnittstellen um auf Eigenschaften des Tags zuzugreifen und diese zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement.tagName);&lt;br /&gt;
console.log(document.documentElement.innerHTML);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie Dokumente können Element-Objekten weitere Node-Objekte als Unterknoten angehängt und nach ihnen gesucht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neue Element-Objekte werden über die Funktion &amp;lt;code&amp;gt;createElement()&amp;lt;/code&amp;gt; eines &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekts unter Angabe des Tag-Namens erzeugt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
console.log(absatz.tagName);&lt;br /&gt;
console.log(absatz.nodeType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung wird das neue Element dem augerufenen Dokument durch die Eigenschaft &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt; als zugehörig markiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var block = document.createElement(&#039;div&#039;);&lt;br /&gt;
console.log(block.ownerDocument);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da die Schnittstelle eines Dokuments nicht mit HTML-Standards gekoppelt ist, können beliebige Tag-Namen vergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinElement = document.createElement(&#039;mein-element&#039;);&lt;br /&gt;
console.log(meinElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Suchen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig bei der Arbeit mit Dokumenten ist die Suche von einzelnen oder mehreren Elementen.&lt;br /&gt;
Aufgrund dessen haben sich die Schnittstellen für die Suche im Browser über die letzten Jahre rapide verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorgefertige Kriterien===&lt;br /&gt;
&lt;br /&gt;
Die ursprünglichen Funktionen zum Suchen von Elementen erlauben wenige festgelegte Kriterien.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeld = document.getElementById(&#039;spielfeld&#039;);&lt;br /&gt;
console.log(spielfeld);&lt;br /&gt;
&lt;br /&gt;
var divElemente = document.getElementsByTagName(&#039;div&#039;);&lt;br /&gt;
console.log(divElemente);&lt;br /&gt;
&lt;br /&gt;
var gegnerElemente = document.getElementsByClassName(&#039;gegner&#039;);&lt;br /&gt;
console.log(gegnerElemente.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Weise können Elemente anhand der ID, Klasse oder des Tag-Namen gesucht werden.&lt;br /&gt;
Der Rückgabewert ist bei der ID-Suche ein &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Objekt und bei den anderen eine &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt;, ein Array-artiges Objekt von Nodes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CSS-Selektoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Suche mithilfe von vorgefertigen Kriterien hat deutliche Limitierungen.&lt;br /&gt;
Deswegen enstand durch Bibliotheken wie jQuery das Konzept von Query-Selektoren, welche als&lt;br /&gt;
[http://www.w3.org/TR/CSS2/selector.html CSS-Selektoren] standardisiert werden und in vielen Browser verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine CSS-Selektorgruppe beschreibt beliebig viele Kriterien, die auf ein oder mehrere HTML-Elemente zutreffen.&lt;br /&gt;
Der Name wurde so gewählt, da diese ebenso in Stylesheets genutzt werden um Elemente auszuwählen.&lt;br /&gt;
Aufgrund der Kombinierbarkeit von CSS-Selektoren ergibt sich eine sehr mächtige Suchfunktionalität.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Funktionen für die Suche mit CSS-Selektoren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelector()&amp;lt;/code&amp;gt; liefert das erste Element zurück welches die Kriterien erfüllt&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelectorAll()&amp;lt;/code&amp;gt; liefert alle Elemente zurück welche die Kriterien erfüllen in Form einer &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Mögliche Kriterien====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das einfachste Kriterium für einen CSS-Selektor ist die Angabe eines Tag-Namen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.querySelectorAll(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Angabe einer ID eines HTML-Elements erfolgt durch eine vorangestellte Raute (&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeldElement = document.querySelector(&#039;#spielfeld&#039;);&lt;br /&gt;
console.log(spielfeldElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Klassen-Selektoren werden durch einen vorangestellten Punkt (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegnerElemente = document.querySelectorAll(&#039;.gegner&#039;);&lt;br /&gt;
console.log(gegnerElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Mächtigkeit von CSS-Selektoren ergibt sich vor allem durch die beliebige Kombinationsmöglichkeiten von Selektoren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var schwierigeGegnerElemente =&lt;br /&gt;
  document.querySelectorAll(&#039;.gegner.schwierig&#039;);&lt;br /&gt;
console.log(schwierigeGegnerElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 1:&#039;&#039;&#039; Die Komplexität einer CSS-Selektorgruppe beeinflusst die Performance einer Suche.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung 2:&#039;&#039;&#039; Eine vollständige Erklärung der Funktionsweise von CSS-Selektoren ist nicht Ziel dieses Tutoriums.&lt;br /&gt;
Diese Einführung dient lediglich dazu ein grundsätzliches Verständnis für den Umgang mit Selektoren zu vermitteln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hinzufügen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neu erstellte Elemente können im Dokument als untergeordnete Knoten mithilfe von &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
document.documentElement.appendChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der künftig übergeordnete Knoten muss angesprochen werden, wenn das Element an einer bestimmten Stelle landen soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.querySelector(&#039;div&#039;);&lt;br /&gt;
var spielfeld = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielfeld.appendChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifizieren von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe der entsprechenden DOM-Schnittstellen können Text, HTML, Attribute sowie das Styling von Elementen beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von Text und HTML===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der gesamte HTML-Inhalt eines Elements kann mithilfe der Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;Hallo Welt&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von einfachen Text-Änderungen lässt sich sogar das gesamte enthaltene HTML beeinflussen.&lt;br /&gt;
Anstatt also mit der DOM-API einzelne Elemente zu erzeugen kann einfach Markup als Wert zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;p&amp;gt;Hallo &amp;lt;strong&amp;gt;Welt!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von Attributen===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die Attribute eines HTML-Elements gibt es die Funktionen &amp;lt;code&amp;gt;getAttribute()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Beide akzeptieren als erstes Argument den Namen des Attributs, der Setter akzeptiert außerdem einen zu setzenden Wert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
spielerElement.innerHTML = &#039;_|_&#039;;&lt;br /&gt;
spielerElement.setAttribute(&#039;class&#039;, &#039;spieler&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(spielerElement);&lt;br /&gt;
&lt;br /&gt;
console.log(spielerElement.getAttribute(&#039;class&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Besonders häufige Attributsänderungen sind das Hinzufügen und/oder Entfernen von Klassen.&lt;br /&gt;
Dafür gibt es in neueren Browsern die Liste &amp;lt;code&amp;gt;classList&amp;lt;/code&amp;gt; auf jedem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt, welche die Arbeit erleichtert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerElement = document.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
spielerElement.classList.add(&#039;unbesiegbar&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ändern von CSS-Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neben dem Document Object Model existiert außerdem der [http://dev.w3.org/csswg/cssom/ CSS Object Model Standard]&lt;br /&gt;
welcher die Schnittstelle für den Zugriff auf CSS-Eigenschaften von DOM-Objekten standardisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein jedes DOM-Element vom Typ &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; besitzt eine Eigenschaft &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; welche alle CSS-Eigenschaften beherbergt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
console.log(body.style.color);&lt;br /&gt;
console.log(body.style.padding);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften spiegeln die in Stylesheets definierten Regeln wieder, jedoch inklusive dem kaskadierenden Charakter.&lt;br /&gt;
Das heisst dass ein Element-Objekt nicht zwingend selbst eine &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; besitzt, diese jedoch für die Anzeige vererbt bekommt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften können ebenso beliebig modifiziert werden, was zu einer sofortigen Anpassung der Darstellung führt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.style.backgroundColor = &#039;#AAF&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Elementen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie neue Elemente einem Dokument hinzugefügt werden können, so können diese oder bestehende auch gelöscht werden.&lt;br /&gt;
Dazu muss man den übergeordneten Knoten ansteuern und mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt; die Entfernung durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielfeld = document.querySelector(&#039;.spielfeld&#039;);&lt;br /&gt;
var spielerElement = spielfeld.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
spielfeld.removeChild(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist einem der übergeordnete Knoten nicht bekannt so kann diesen mithilfe der Knotenverweise ermitteln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var entferneKnoten = function(knoten) {&lt;br /&gt;
  if (!knoten.parentNode) {&lt;br /&gt;
    throw new Error(&#039;no parent node&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  knoten.parentNode.removeChild(knoten);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spielerElement = document.querySelector(&#039;.spieler&#039;);&lt;br /&gt;
entferneKnoten(spielerElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=DOM Events=&lt;br /&gt;
&lt;br /&gt;
==Ereignisorientierte Programmierung==&lt;br /&gt;
&lt;br /&gt;
Für die Verarbeitung von stets verfügbaren Informationen eignet sich eine sequentiell ablaufende Folge von Instruktionen.&lt;br /&gt;
Ergeben sich Informationen jedoch nicht deterministisch zur Laufzeit bietet sich die ereignisorientierte Programmierung an.&lt;br /&gt;
Hierbei wird nicht mehr aktiv auf eine Information gewartet, das Programm wird benachrichtigt wenn ein Ereignis eintritt.&lt;br /&gt;
Somit gibt es nicht nur einen einzelnen Kontrollfluss, sondern beliebig viele welche sogar auch parallel ablaufen können.&lt;br /&gt;
&lt;br /&gt;
==Ereignisse im Browser==&lt;br /&gt;
&lt;br /&gt;
Bei der Betrachtung von und der Interaktion mit Websites im Browser ergeben sich sehr viele unterschiedliche Ereignisse.&lt;br /&gt;
Zunächst wird die HTML-Seite geladen und gerendert, danach geschieht dies für alle anderen referenzierten Medien.&lt;br /&gt;
Diese Vorgänge lösen bereits nicht deterministische Ereignisse aus welche alleine durch den Browser verursacht werden.&lt;br /&gt;
So gibt es für die meisten Medien ein Ereignis welches beschreibt dass diese fertig geladen und gerendert wurden.&lt;br /&gt;
&lt;br /&gt;
Sobald der Browser beginnt eine Web-Seite zu rendern können Ereignisse von Seiten des Benutzers eintreten.&lt;br /&gt;
Nahezu jede Benutzerinteraktion löst im Browser ein Ereignis aus welches wiederum in weiteren Aktionen resultiert.&lt;br /&gt;
Klickt der Benutzer auf einen Link so ist das ein Ereignis welches zur Folge hat dass die geklickte URL geladen wird.&lt;br /&gt;
Wird ein Scroll-Balken vom Benutzer bewegt ergibt sich daraus ein Ereignis welches den Browser in Folge scrollen lässt.&lt;br /&gt;
&lt;br /&gt;
Zu den wichtigsten Arten von durch den Benutzer ausgelösten Ereignissen zählen: &lt;br /&gt;
&lt;br /&gt;
* Mausbewegungen und -klicks&lt;br /&gt;
* Tastatureingaben&lt;br /&gt;
* Scrolling&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Auflistung der möglichen Ereignisse im Browser finden Sie auf [https://developer.mozilla.org/en-US/docs/Web/Events dieser] MDN-Seite. &lt;br /&gt;
Nebem dem Browser und dem Benutzer gibt es auch andere Auslöser wie zum Beispiel mit der Website verbundene Server/Backends. &lt;br /&gt;
&lt;br /&gt;
==Aufbau eines Ereignisses==&lt;br /&gt;
&lt;br /&gt;
Im Sinne einer standardisierten Ereignisverarbeitung besitzt ein im Browser auftretendes Ereignis immer drei folgende Merkmale: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Name:&#039;&#039;&#039; eine Zeichenkette die das Ereignis in der Regel in der Gegenwart beschreibt, z.B. &amp;quot;click&amp;quot; oder &amp;quot;mousemove&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Daten:&#039;&#039;&#039; ein Objekt mit einer pro Ereignis festgelegten Struktur, welches die wichtigsten Ereignisdaten enthält&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Ziel:&#039;&#039;&#039; ein Objekt das als Ziel des Ereignis festgelegt wird; in der Regel handelt es sich um DOM-Elemente&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein solches Ereignis: Eine &#039;&#039;&#039;Tastatureingabe&#039;&#039;&#039; in einem &#039;&#039;&#039;Formularfeld&#039;&#039;&#039;, bei dem das Zeichen &#039;&#039;&#039;@&#039;&#039;&#039; eingegeben wird. &lt;br /&gt;
&lt;br /&gt;
==Phasen der Ereignispropagierung==&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei dem ursprünglichen Ziel eines Ereignisses um ein DOM-Objekt werden in der Regel drei Phasen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
===Capturing-Phase===&lt;br /&gt;
&lt;br /&gt;
In Phase 1, der sogenannten &#039;&#039;&#039;Capturing-Phase&#039;&#039;&#039; wird zuerst ein Ereignis mit dem obersten Knoten im Dokument als Ziel erzeugt.&lt;br /&gt;
Dabei handelt es sich in der Regel um das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt, welches alle andere DOM-Objekte als Unterknoten enthält.&lt;br /&gt;
Das wird schrittweise wiederholt für jeden untergeordneten Knoten auf dem Pfad zum eigentlichen Ziel des Ereignisses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
+ window (optional)         - Ereignis mit window als aktueller Ziel&lt;br /&gt;
  + document                - Ereignis mit body als aktueller Ziel&lt;br /&gt;
    + body                  - Ereignis mit body als aktueller Ziel&lt;br /&gt;
      + p (ursprüngliches Ziel)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Bei manchen Ereignissen wird das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als oberstes Objekt in die Hierarchie der Ziele mit aufgenommen.&lt;br /&gt;
&lt;br /&gt;
===Target-Phase===&lt;br /&gt;
&lt;br /&gt;
Ist der Browser nun beim ursprünglichen Ziel angelangt wird in Phase 2 gewechselt, der sogenannten &#039;&#039;&#039;Target-Phase&#039;&#039;&#039;.&lt;br /&gt;
Dabei wird ein einzelnes Ereignis erzeugt, für welches das ursprüngliche DOM-Objekt als Ziel verwendet wird.&lt;br /&gt;
&lt;br /&gt;
===Bubbling-Phase===&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss der Ereignispropagierung wechselt der Browser in Phase 3, der sogenannten &#039;&#039;&#039;Bubbling-Phase&#039;&#039;&#039;.&lt;br /&gt;
Hierbei wird der Pfad der Capturing-Phase in umgekehrter Richtung durchlaufen und jeweils wieder ein Ereignis erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In Bibliotheken wie jQuery hat man nur Zugriff auf die Bubbling-Phase, nicht auf die Capturing-Phase.&lt;br /&gt;
&lt;br /&gt;
===Browser-Unterschiede===&lt;br /&gt;
&lt;br /&gt;
Die Capturing- und Bubbling-Phasen bilden in ihrer Implementierung die Tatsache ab dass &lt;br /&gt;
wenn ein Ereignis auf einem Element stattfindet, dieses Ereignis ebenso für das Element umgebende Elemente gültig ist.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wird ein Mensch in einem Krankenhaus geboren, so wird dieser auch in einer Stadt geboren, in einem Land geboren.&lt;br /&gt;
&lt;br /&gt;
Einer der beiden oben beschriebenen Phasen wäre allerdings vollkommen ausreichend für die Ereignisvearbeitung.&lt;br /&gt;
Aufgrund von unterschiedlichen Implementierungen der Browser-Hersteller existieren heutzutage jedoch beide gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
===Globale Ereignisse===&lt;br /&gt;
&lt;br /&gt;
Beschreibt ein Ereignis ein globales Geschehen wird oftmals das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als Ereignisziel verwendet.&lt;br /&gt;
In diesen Fällen ist es möglich dass weder Capturing- noch eine Bubbling-Phase durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Ergeinis &amp;quot;DOMContentLoaded&amp;quot; beschreibt, dass eine Seite abgesehen siner externen Medien fertig geladen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der DOM-Schnittstelle erhält man die Möglichkeit Ereignisse selbst zu verarbeiten und darauf zu reagieren.&lt;br /&gt;
&lt;br /&gt;
===Anmeldung===&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt; kann auf jedem DOM-Objekt, dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt und dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt aufgerufen werden.&lt;br /&gt;
Dabei ist das Objekt auf dem die Funktion aufgerufen das &#039;&#039;&#039;Ziel&#039;&#039;&#039; des Ereignisses welches verarbeiten werden soll.&lt;br /&gt;
&lt;br /&gt;
Die Funktion akzeptiert außerdem die folgenden drei Argumente: &lt;br /&gt;
* den &#039;&#039;&#039;Namen des Ereignisses&#039;&#039;&#039; das man verarbeiten möchte in Form eines Strings&lt;br /&gt;
* die &#039;&#039;&#039;Callback-Funktion&#039;&#039;&#039; welche das Ereignis-Objekt erwartet und den Code zur Verarbeitung enthält&lt;br /&gt;
* ein optionales &#039;&#039;&#039;Flag&#039;&#039;&#039; das bestimmt ob das Ereignis in der Capturing- oder Bubbling-Phase verarbeitet werden soll&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist das Flag &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, was bedeutet dass das Ereignis in der Bubbling-Phase verarbeitet wird.&lt;br /&gt;
Durch einen Aufruf wird für ein Ereignis auf einem Ziel ein sogenannter Event-Listener in Form einer Funktion angemeldet.&lt;br /&gt;
Jedes Mal wenn das Ereignis auftritt wird die Callback-Funktion aufgerufen und das entsprechende Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennSeiteGeladenIst = function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite ist nun fertig geladen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
}&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, informiereMichWennSeiteGeladenIst, false);&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a id=&amp;quot;link1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var link = document.querySelector(&#039;#link1&#039;);&lt;br /&gt;
var informiereMichWennLinkGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Der Link wurde geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
link.addEventListener(&#039;click&#039;, informiereMichWennLinkGeklicktWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Phasen der Ereignispropagierung kann man Ereignisse global verarbeiten unabhängig davon wo sie stattgefunden haben.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var informiereMichWennGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat irgendwo auf der Seite geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;click&#039;, informiereMichWennGeklicktWird);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
&lt;br /&gt;
Ein Callback ist eine Rückruffunktion welche an ein andere Funktion übergeben wird und zu späteren Zeitpunkten ggf. ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennMausBewegtWird = function() {&lt;br /&gt;
  console.log(&#039;Benutzer hat geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, informiereMichWennMausBewegtWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist jedoch nicht garantiert dass eine übergebene Callback-Funktion überhaupt jemals ausgeführt wird.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichFallsEsOktoberIst = function(event) {&lt;br /&gt;
  console.log(&#039;Es ist Oktober&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var istEsOktober = function(callback) {&lt;br /&gt;
  if (new Date().getMonth() == 9) callback();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
istEsOktober(informiereMichFallsEsOktoberIst);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Callback-Mechanismen unterstützen den Umgang mit nicht deterministischen und asynchronen Ereignissen in JavaScript.&lt;br /&gt;
&lt;br /&gt;
===Ereignis-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Event-Listener-Callback-Funktion wird beim Aufruf ein für ein Ereignis spezifisches Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
  console.log(event.screenX);&lt;br /&gt;
  console.log(event.screenY);&lt;br /&gt;
  console.log(event.button);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Objekt enthält neben spezifischen auch generelle Ereignisinformationen wie zum Beispiel das Ereignis-Ziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich der drei Phasen die ein Ereignis durchlaufen kann unterscheidet man zwischen ursprünglichem und aktuellem Ziel.Das aktuelle Ziel ist das auf welchem das Ereignis aktuell ausgelöst wird und das ursprüngliche das wo es stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target); // ursprüngliches Ziel&lt;br /&gt;
  console.log(event.currentTarget); // aktuelles Ziel&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Ziel &amp;lt;code&amp;gt;currentTarget&amp;lt;/code&amp;gt; entspricht also immer dem Objekt auf dem man den Event-Handler angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
===Abmeldung===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;removeEventListener&amp;lt;/code&amp;gt; kann ein zuvor angemeldeter Event-Listener wieder von einem Objekt entfernt werden.&lt;br /&gt;
Diese Funktion benötigt im Gegensatz zu &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt;nur zwei Argumente: Den Ereignis-Namen und die Event-Listener-Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeMausBewegungen = function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
document.removeEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Standardverhalten===&lt;br /&gt;
&lt;br /&gt;
Nachdem alle Ereignisse erzeugt und verarbeitet wurden führt der Browser gegegebenfalls eine sogenannte &amp;quot;Default Action&amp;quot; aus.&lt;br /&gt;
Im Wesentlichen ist eine solche Aktion das Standardverhalten des Browsers als Reaktion auf das eingetretene Ereignis.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Benutzer klickt auf einen Link -&amp;gt; der Browser lädt die URL&lt;br /&gt;
* Benutzer führt Tastatureingaben in einem Feld aus -&amp;gt; der Browser fügt die Zeichen dem Feld hinzu&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Event-Listener-Funktion ist es möglich mithilfe von &amp;lt;code&amp;gt;preventDefault()&amp;lt;/code&amp;gt; das Standardverhalten zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  event.preventDefault();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben dargestellte Code führt zum Beispiel dazu dass kein Klick auf einen Link die enthaltene URL aufruft.&lt;br /&gt;
&lt;br /&gt;
==Wichtige Events==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse sind die wichtigsten in der täglichen browser-seitingen Anwendungsentwicklung mit JavaScript.&lt;br /&gt;
&lt;br /&gt;
===DOMContentLoaded===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis beschreibt dass das HTML geladen und interpretiert wurde und das DOM und CSSOM erzeugt und gerendert wurde.&lt;br /&gt;
Es wird keine Aussage darüber gemacht ob weitere externe referenzierte Inhalte bereits geladen wurden, wie z.B. Bilder.&lt;br /&gt;
Das Ereignis wird direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt als Ereignisziel ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Mit der Seite kann interagiert werden&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===load===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis besagt dass die gesamte Web-Seite inklusive aller externen referenziereten Inhalte gerendert wurden.&lt;br /&gt;
Im Gegensatz zu &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; wird dieses Ereignis direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&#039;load&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite wurde vollständig geladen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===click===&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn der Benutzer (mit der Maus) auf ein sichtbares DOM-Element klickt wird dieses Ereignis ausgelöst.&lt;br /&gt;
Bei der Propagierung dieses Ereignisses werden wie alle drei Ereignisphasen (Capturing, Bubbling, Target) komplett durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat auf etwas geklickt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mousemove, mouseover, mouseout===&lt;br /&gt;
Bei Mausbewegungen über DOM-Element wird konstant das Ereignis &amp;lt;code&amp;gt;mousemove&amp;lt;/code&amp;gt; mit den entsprechenden Koordinaten erzeugt.&lt;br /&gt;
Das Ereignis &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt; wird erzeugt wenn die Maus in das Element eindringt, &amp;lt;code&amp;gt;mouseout&amp;lt;/code&amp;gt; wenn das Element wieder verlassen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseover&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus über etwas bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseout&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus von etwas weg bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===keydown, keyup, keypress===&lt;br /&gt;
&lt;br /&gt;
Bei Tastatureingaben auf einem DOM-Element durch den Benutzer werden die Ereignisse &amp;lt;code&amp;gt;keydown&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;keypress&amp;lt;/code&amp;gt; ausgelöst.&lt;br /&gt;
Die drei unterschiedlichen Ereignisse beschreiben die unterschiedlichen Phasen einer einzelnen Tastatureingabe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;keydown&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste gedrückt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keypress&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste betätigt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keyup&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste losgelassen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von DOM Events kann auch ein genereller, wiederverwendbarer Event-Mechanismus für JavaScript implementiert werden.&lt;br /&gt;
Dazu wird ein DOM-Element erzeugt, welches als virtuelles Ereignisziel dient und nicht ins Dokument eingehängt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var EventDispatcher = function() {&lt;br /&gt;
&lt;br /&gt;
  var target = document.createElement(&#039;div&#039;);&lt;br /&gt;
&lt;br /&gt;
  this.addEventListener = function(type, callback) {&lt;br /&gt;
    target.addEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.dispatchEvent = function(type, detail) {&lt;br /&gt;
    var event = new CustomEvent(type, {&lt;br /&gt;
      bubbles: true,&lt;br /&gt;
      canceable: true,&lt;br /&gt;
      detail: detail&lt;br /&gt;
    });&lt;br /&gt;
    target.dispatchEvent(event);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.removeEventListener = function(type, callback) {&lt;br /&gt;
    target.removeEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Klasse kann dann in beliebigen anderen Komponenten dazu genutzt werden um Ereignisse zu erzeugen und zu propagieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var EventBasiertesInterval = function(delay) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  self.eventDispatcher = new EventDispatcher();&lt;br /&gt;
  self._zaehler = 0;&lt;br /&gt;
&lt;br /&gt;
  setInterval(function() {&lt;br /&gt;
    self.eventDispatcher.dispatchEvent(&#039;interval&#039;, self._zaehler++);&lt;br /&gt;
  }, delay);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var interval = new EventBasiertesInterval(500);&lt;br /&gt;
interval.eventDispatcher.addEventListener(&#039;interval&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;interval &#039;, event.detail);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Timer=&lt;br /&gt;
&lt;br /&gt;
Timer in JavaScript dienen dazu um CPU-intensive Berechnungen in mehrere Teile zu spalten und um Animation zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Thread==&lt;br /&gt;
&lt;br /&gt;
Der Browser stellt für jede dargestellte Web-Seite einen einzelnen Thread zur Verfügung.&lt;br /&gt;
Dieser kümmert sich um das Rendering der Web-Seite, die Verarbeitung von Events und die Ausführung von JavaScript.&lt;br /&gt;
Mit Ausnahme des HTML5-Standards der WebWorker gibt es dementsprechend in JavaScript kein Multithreading.&lt;br /&gt;
&lt;br /&gt;
Intern bestitzt der Thread eine Liste an Aufgaben die er stets als nächstes ausführen wird, der sogenannten Queue.&lt;br /&gt;
Wird eine Web-Seite zum ersten Mal geladen verursacht dies gleich mehrere Einträge in der Queue, wie zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
* Parsen des Markups und Aufbau des DOMs&lt;br /&gt;
* Parsen des CSS und Aufbau des CSSOMs&lt;br /&gt;
* Rendering der Seite&lt;br /&gt;
* Ausführung von geladenem JavaScript-Code&lt;br /&gt;
&lt;br /&gt;
Manche Aufgaben benötigen unter Umständen viel Zeit und können so auch die Ausführung anderer Aufgaben beeinflussen.&lt;br /&gt;
Nimmt ein Stück JavaScript-Code die CPU zu lange in Anspruch kann der Browser z.B. keine Benutzereingaben mehr vearbeiten.&lt;br /&gt;
Um dies zu vermeiden ist ein Zeit- bzw. Code-Limit für JavaScript eingebaut bevor der Browser eine Warnung ausgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var wartezeitInMs = 5000;  &lt;br /&gt;
while (new Date() - programmStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Timeouts==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;setTimeout(callback, delayMs)&amp;lt;/code&amp;gt; kann man einen einmalig auszuführenden Timer auf der Thread-Queue anmelden.&lt;br /&gt;
Die übergebene Callback-Funktion wird &#039;&#039;&#039;ungefähr&#039;&#039;&#039; nach einer Wartezeit mit Länge der übergebenen Dauer ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Es werden Einträge in der Thread-Queue erzeugt die überprüfen ob es Zeit ist den Callback auszuführen und das dann ggf. tun.&lt;br /&gt;
Aufgrund der vielen Aufgaben des Threads kann die Wartezeit überschritten werden, wenn andere Aufgaben viel Zeit beanspruchen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(&#039;Nachricht &#039; + vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 500);&lt;br /&gt;
while (new Date() - programmStart &amp;lt; 1000) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Wartezeit von 0 Millisekunden heißt, dass der Interpreter die Callback-Funktion so bald wie möglich ausführen soll. &lt;br /&gt;
Abhängig von der Browser-Implementierung kann es sein dass die minimale Wartezeit aber bis zu 15 Millisekunden beträgt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(&#039;Nachricht &#039; + vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist möglich mit Timern CPU-intensive Aufgaben in mehrere Teile zu spalten oder auch Aufgaben wiederholt auszuführen.&lt;br /&gt;
Dazu erzeugt man einfach eine Funktion welche sich wiederum selbst durch einen &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt;-Aufruf als Timer registriert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll die wiederholte Ausführung beendet werden kann dies durch einen Aufruf von &amp;lt;code&amp;gt;clearTimeout(timeoutId)&amp;lt;/code&amp;gt; erreicht werden.&lt;br /&gt;
Dabei wird der Eintrag mit gegebener Timeout-ID aus der Thread-Queue gelöscht wodurch der angemeldete Timer nicht ausgeführt wird.&lt;br /&gt;
Die notwendige Timeout-ID für die Abmeldung wird beim Anmelden durch &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; als numerischer Rückgabewert bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var timeoutId = null;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  timeoutId = setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearTimeout(timeoutId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; eignet sich vor allem für wiederholende Aufgaben welche nichts mit Rendering zu tun haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Intervalle==&lt;br /&gt;
&lt;br /&gt;
Außerdem existiert die Funktion &amp;lt;code&amp;gt;setInterval(callback, delayMs)&amp;lt;/code&amp;gt; welche einen wiederholt auszuführenden Timer regsitriert.&lt;br /&gt;
Es wird ebenso eine Callback-Funktion erwartet und eine Wartezeit zwischen den einzelnen Ausführungen des Callbacks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; wird eine Interval-ID zurückgegeben, welche für die Abmeldung mittels &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
var intervalId = setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearInterval(intervalId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst wirkt &amp;lt;code&amp;gt;setInterval()&amp;lt;/code&amp;gt; komfortabler, da der Callback nicht durch die wiederholende Timer-Registrierung verunreinigt wird.&lt;br /&gt;
Jedoch besteht bei dieser Funktion der Nachteil dass die Messung der Wartezeit &#039;&#039;&#039;vor&#039;&#039;&#039; Ausführung des Callbacks beginnt.&lt;br /&gt;
Registriert man eine Aufgabe die länger braucht als die definierte Wartezeit wird der JavaScript-Thread sehr stark beansprucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var warteEineBestimmeZeit = function() {&lt;br /&gt;
  var funktionsStart = new Date();&lt;br /&gt;
  var wartezeitInMs = 50;&lt;br /&gt;
  while (new Date() - funktionsStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
    // nichts tun&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
setInterval(warteEineBestimmeZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obwohl der Browser zwar noch CPU-Zeit zur Verfügung hat ist er fast nur damit beschäftigt die überfälligen Callbacks auszuführen.&lt;br /&gt;
Aufgrund dessen ist es sinnvoller &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; für wiederholende Aufgaben zu verwenden deren Dauer nicht exakt vorhersehbar ist.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der vielen verschiedenen Aufgaben des JavaScript-Threads ist eine exakte Wartezeit bei Timern nicht garantiert.&lt;br /&gt;
Sollen Werte abhängig von der vergangenen Zeit verändern sollten Datum-Objekte in die Berechnungen mit einbezogen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var objekt = {position: 0, geschwindigkeitProSekunde: 1};&lt;br /&gt;
var letzterTimerAufruf = new Date();&lt;br /&gt;
var bewegeObjekt = function() {&lt;br /&gt;
  var vergangeneZeitInMs = new Date() - letzterTimerAufruf;&lt;br /&gt;
  objekt.position += geschwindigkeitProSekunde * (vergangeneZeitInMs / 1000);&lt;br /&gt;
  console.log(&#039;Aktuelle Position: &#039; + objekt.position);&lt;br /&gt;
  letzterTimerAufruf = new Date();&lt;br /&gt;
  setTimeout(bewegeObjekt, 1000);&lt;br /&gt;
};&lt;br /&gt;
bewegeObjekt();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Frames==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; ist es möglich neben wiederholenden Aufgaben auch Animationen im Browser zu implementieren.&lt;br /&gt;
Dazu werden in der Callback-Funktion einfach die zu bewegenden Elemente entsprechend in ihrer Form und Position verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
div.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeRechteck = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  div.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  setTimeout(bewegeRechteck, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeRechteck();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird versucht dass Rechteck ca. 60 Mal in der Sekunde zu bewegen, also eine Bildwiederholrate von 60 simuliert.&lt;br /&gt;
Es kann allerdings vorkommen dass der Browser viele anderen Dingen zu tun hat und ihn ein solcher Timer zusätzlich sehr beansprucht.&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es speziell für Animationen und visuelle Änderungen die Funktion &amp;lt;code&amp;gt;requestAnimationFrame(callback)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese erwartet lediglich einen Callback und kümmert sich intern darum wann der Callback das nächste Mal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
div.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeRechteck = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  div.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  requestAnimationFrame(bewegeRechteck, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeRechteck();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;clearTimeout()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; gibt es die Funktion &amp;lt;code&amp;gt;cancelAnimationFrame(frameId)&amp;lt;/code&amp;gt; für die Abmeldung.&lt;br /&gt;
Diese akzeptiert eine Frame-ID welche wiederum von &amp;lt;code&amp;gt;requestAnimationFrame()&amp;lt;/code&amp;gt; zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist empfehlenswert Animation mit &amp;lt;code&amp;gt;requestAnimationFrame&amp;lt;/code&amp;gt; zu implementieren.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38263</id>
		<title>JavaScript-Tutorium:Browser</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=38263"/>
		<updated>2015-10-14T21:54:05Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten bei der JavaScript-Entwicklung im Browser zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Einführung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Native vs. Host==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer JavaScript-Umgebung existieren zwei Arten von Objekte.&lt;br /&gt;
&#039;&#039;&#039;Native Objekte&#039;&#039;&#039; werden von der Engine bereitgestellt und sind durch den ECMAScript-Standard abgedeckt.&lt;br /&gt;
&#039;&#039;&#039;Host-Objekte&#039;&#039;&#039; sind nicht immer standardisiert und werden von der Umgebung bereitgestellt.&lt;br /&gt;
Im Browser handelt es sich bei Host-Objekten um Schnittstellen für den Zugriff auf den Browser und externe Geräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==HTML5-Standard==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Obwohl es den ECMAScript-Standard gibt, muss man davon ausgehen,&lt;br /&gt;
dass sich die verfügbaren APIs von Browser zu Browser unterscheiden können.&lt;br /&gt;
Durch die steigende Entwicklungsgeschwindigkeit der Browser-Hersteller und den&lt;br /&gt;
[https://html.spec.whatwg.org/multipage/ HTML5-Standard] verbessert sich diese Situation.&lt;br /&gt;
&lt;br /&gt;
Heutzutage kann man davon ausgehen, dass jeweils die neuesten Versionen von Firefox und Chrome&lt;br /&gt;
die DOM-API und viele der neu verfassten HTML5-APIs bereits standardkonform unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inline Code vs. externe Dateien==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine im Browser angezeigte Web-Seite besteht meist aus HTML, CSS und JavaScript, wobei nur HTML zwingend verlangt ist.&lt;br /&gt;
Der JavaScript-Code kümmert sich normalerweise um die dynamischen Aspekte, wie Interaktionen und das Nachladen von Inhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Browser lädt ein HTML-Dokument unter der angegebenen URL herunter und evaluiert dieses.&lt;br /&gt;
Das Dokument enthält optional Verweise auf CSS-Dateien, Bilder, JavaScript-Dateien und andere Medien.&lt;br /&gt;
Neben Verweisen auf externen JavaScript-Code kann das Dokument auch Inline-Code enthalten.&lt;br /&gt;
Ob es sich um externe Dateien oder Inline-Code handelt wirkt sich auf die Ladezeiten aus,&lt;br /&gt;
der Code selbst wird davon nicht beeinflusst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Reihenfolge der eingebunden Code-Blöcke und angegebenen Dateiverweise ist wichtig,&lt;br /&gt;
da diese ebenso die Reihenfolge der Code-Ausführung darstellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Kontext==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für jede Web-Seite, unabhängig davon ob sie im separaten Fenster oder als Tab angezeigt wird,&lt;br /&gt;
erzeugt der Browser einen separaten isolierten JavaScript-Kontext, in dem Code ausgeführt wird.&lt;br /&gt;
Das bedeutet, dass alle Objekte und Funktionen nur so lange existieren bis die Seite neu geladen oder verlassen wird.&lt;br /&gt;
Ein Zugriff auf andere Seiten ist aus Sicherheitsgründen nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
=Window=&lt;br /&gt;
&lt;br /&gt;
Das globale Objekt &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; referenziert alle im Browser verfügbaren Objekte und Werte als Eigenschaften (native und host).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.Object);&lt;br /&gt;
console.log(window.XMLHttpRequest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf globale Eigenschaften ist es nicht notwendig explizit &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; zu schreiben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Date == window.Date);&lt;br /&gt;
console.log(new Date());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht innerhalb von Funktionen deklarierten Variablen werden automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var globaleVariable = &#039;global&#039;;&lt;br /&gt;
var globaleFunktion = function() {};&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
console.log(window.globaleFunktion);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modifikation von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Da es sich um ein normales Objekt handelt können die meisten Eigenschaften modifiziert und auch gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Veränderungen von globalen Eigenschaften sind nicht sinnvoll und können schwerwiegende Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.Object = {};&lt;br /&gt;
var objekt = new Object();&lt;br /&gt;
&lt;br /&gt;
delete window.Array;&lt;br /&gt;
var array = new Array();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt wird vom Browser mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; erzeugt, welche auch global verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.constructor == window.Window);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Popups und Frames==&lt;br /&gt;
&lt;br /&gt;
Neben dem globalen Fenster-Objekt kann eine Web-Seite beliebig viele weitere &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekte enthalten.&lt;br /&gt;
Dabei handelt es sich dann entweder um durch Code erzeugte Popups oder aber um Frames (besser bekannt als iframes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.open(&#039;https://www.google.com&#039;, &#039;Google im Popup&#039;, &#039;width=400,height=300,resizable=yes&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frames können entweder durch das entsprechende HTML oder aber auch wie im Code gezeigt programmatisch erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
==Browser-Schnittstellen==&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den nativen Objekten notwendigen Objekte enthält &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; wichtige Browser- und Geräte-Schinttstellen.&lt;br /&gt;
Dazu zählen zum Beispiel Funktionen um Dialoge im Browser zu öffnen oder aber sogar um Game-Controller zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = window.prompt(&#039;Wie ist Ihr Name?&#039;);&lt;br /&gt;
window.alert(&#039;Hello &#039; + name);&lt;br /&gt;
window.alert(&#039;Die aktuelle Seite ist &#039; + window.innerWidth + &#039;px breit&#039;);&lt;br /&gt;
&lt;br /&gt;
console.log(window.Gamepad);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Liste der verfügbaren Eigenschaften finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/de/docs/DOM/window dieser] MDN-Seite.&lt;br /&gt;
In den folgenden Abschnitten werden exemplarisch ein paar wichtige Objekte im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Beispiel für Browser-Schnittstellen=&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; ist ein globales Objekt welches die aktuelle URL und ihre Bestandteile enthält und diese auch verändern kann.&lt;br /&gt;
Das Objekt wird analog zum &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt; erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.location.constructor == window.Location);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen der URL===&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; enhtält die gesamte aktuelle URL. Alternativ kann auch &amp;lt;code&amp;gt;location.toString()&amp;lt;/code&amp;gt; genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.href);&lt;br /&gt;
console.log(location.toString());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einzelne Bestandteile der URL ermitteln zu können werden viele separate Eigenschaften bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.protocol);&lt;br /&gt;
console.log(location.host);&lt;br /&gt;
console.log(location.port);&lt;br /&gt;
console.log(location.pathname);&lt;br /&gt;
console.log(location.hash);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verändern der URL===&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften können nicht nur lesend genutzt werden, sondern auch um Änderungen an der aktuellen URL vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Mit der Ausname von &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; führen Änderungen der Eigenschaften zum Verlassen der aktuellen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.protocol = &#039;http&#039;;&lt;br /&gt;
location.port = &#039;8080&#039;;&lt;br /&gt;
location.hash = &#039;#anker&#039;;&lt;br /&gt;
location.href = &#039;https://www.google.com&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es ein paar Funktionen um die URL zu modifizieren oder aber die Seite neuzuladen:&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.assign(&#039;https://www.google.com&#039;);&lt;br /&gt;
location.reload(true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
Das globale &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt;-Objekt ermöglicht den programmatischen Zugriff auf den Browser-Verlauf.&lt;br /&gt;
Es werden Funktionen zur Verfügung gestellt um im Verlauf beliebig viele Schritte zurück und vorwärts zu gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
history.back();&lt;br /&gt;
history.forward();&lt;br /&gt;
history.go(-3);&lt;br /&gt;
history.go(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Aus Sicherheitsgründen ist es nicht erlaubt auf Informationen einzelner Einträge im Verlauf zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
==Navigator==&lt;br /&gt;
&lt;br /&gt;
Für detaillierte Informationen über den aktuellen Client bzw. Browser existiert das &amp;lt;code&amp;gt;navigator&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
Die meistgenutzte Eigenschaft &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; ermöglicht das Feststellen des Browser-Herstellers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(navigator.userAgent);&lt;br /&gt;
console.log(navigator.battery);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Document Object Model=&lt;br /&gt;
&lt;br /&gt;
Im Browser können einem Fenster beliebig viele Dokumentenobjekte zugeordnet werden, mindestens aber ein Hauptdokument. &lt;br /&gt;
Das automatisch erstellte Hauptdokument wird über die globale Variable &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; zur Verfügung gestellt.&lt;br /&gt;
Die Schnittstelle für den Dokumentenzugriff wird durch das [http://www.w3.org/DOM/ Document Object Model] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
==Objektmodell==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekt repräsentiert ein vom Browser interpretiertes HTML-Dokument als Objektmodell mit einer Baumstruktur.&lt;br /&gt;
Dabei werden Tags, Texte und Kommentare in Knoten umgewandelt, wobei Tag-Knoten wiederum Unterknoten haben können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
      Text&lt;br /&gt;
      &amp;lt;!-- Kommentar --&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Eingabe&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das oben dargestellte Markup wird bei der Interpretation durch den Browser in folgendes Objektmodell übersetzt:&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Knoten mit den Unterknoten &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;-Knoten mit dem Unterknoten &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;-Knoten mit einem Text-Unterknoten&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Knoten mit den Unterknoten &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;-Knoten mit einem Text-Unterknoten und einem Kommentar-Unterknoten&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;-Knoten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Achtet man bei HTML auf eine korrekte Einrückung so ist das resultierende Objektmodell meist klar erkennbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Markup-Korrekturen===&lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass es sich beim Objektmodell &#039;&#039;&#039;nicht&#039;&#039;&#039; um ein eindeutiges Abbild des originalen Markups handelt.&lt;br /&gt;
Der Unterschied wird besonders deutlich wenn man das Resultat von folgendem invalidem HTML untersucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Tabelle&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Objektmodell fügt zwischen dem &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;- und dem &amp;lt;code&amp;gt;tr&amp;lt;/code&amp;gt;-Knoten einen &amp;lt;code&amp;gt;tbody&amp;lt;/code&amp;gt;-Knoten ein damit das HTML valide wird.&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Im Browser kann man das Objektmodell einer Seite mit dem (DOM) Inspector der Entwicklerwerkzeuge betrachten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau von Dokumenten==&lt;br /&gt;
&lt;br /&gt;
===Node-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Knoten innerhalb eines Dokumentenobjekts ist direkt oder indirekt abgeleitet vom &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Konstruktor/-Prototypen.&lt;br /&gt;
Mit Ausnahme des Dokumentenobjekts selbst wird allen Knoten ein Dokument zugeordnet durch die &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;-Eigenschaft.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren hat jeder Knoten einen bestimmten numerischen Typen, welcher in der Eigenschaft &amp;lt;code&amp;gt;nodeType&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
Die folgende Liste enthält die gängigsten Typen von Dokumentenknoten denen man bei der Arbeit mit Dokumenten begegnet:&lt;br /&gt;
&lt;br /&gt;
* 1: ELEMENT_NODE&lt;br /&gt;
* 3: TEXT_NODE&lt;br /&gt;
* 8: COMMENT_NODE&lt;br /&gt;
* 9: DOCUMENT_NODE&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Referenz der Eigenschaften von Node-Objekten finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Web/API/Node dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
===Document-Objekte===&lt;br /&gt;
&lt;br /&gt;
Ein Dokument wird mit dem &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Konstruktor erzeugt und ist selbst keinem Dokument, jedoch einem Fenster zugeordnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.defaultView);&lt;br /&gt;
console.log(window == document.defaultView);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Dokument selbst repräsentiert kein HTML-Element, verweist aber auf das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element mit der Eigenschaft &amp;lt;code&amp;gt;documentElement&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktionen eines Dokuments ist es möglich neue &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekte zu erstellen, einzufügen und diese zu suchen.&lt;br /&gt;
===Element-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jedes HTML-Tag wird in einen Knoten übersetzt welcher mit dem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Konstruktor erzeugt wird.&lt;br /&gt;
Element-Objekte besitzen Schnittstellen um auf Eigenschaften eines HTML-Tags zuzugreifen und diese zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement.tagName);&lt;br /&gt;
console.log(document.documentElement.innerHTML);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie Dokumente können Element-Objekten weitere Node-Objekte als Unterknoten angehängt und nach ihnen gesucht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comment-Objekte===&lt;br /&gt;
&lt;br /&gt;
HTML-Kommentare werden in Comment-Objekte umgewandelt welche mit dem &amp;lt;code&amp;gt;Comment&amp;lt;/code&amp;gt;-Konstruktor erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Text-Objekte===&lt;br /&gt;
&lt;br /&gt;
Texte werden in &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt;-Objekte umgewandelt, wobei auf diese auch durch übergeordnete Elemente zugegriffen werden kann.&lt;br /&gt;
Normalerweise wird bei der Anwendungsprogrammierung mit JavaScript nicht direkt mit Text-Knoten gearbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Neue Element-Objekte werden über die Schnittstelle eines &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekts unter der Angabe eines Tag-Namens erzeugt.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
console.log(absatz.tagName);&lt;br /&gt;
console.log(absatz.nodeType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung wird das neue Element dem aufgerufenen Dokument als zugehörig markiert durch die Eigenschaft &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var block = document.createElement(&#039;div&#039;);&lt;br /&gt;
console.log(block.ownerDocument);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Schnittstelle eines Dokuments nicht mit HTML-Standards gekoppelt ist, können beliebige Tag-Namen vergeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinElement = document.createElement(&#039;mein-element&#039;);&lt;br /&gt;
console.log(meinElement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Suchen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig bei der Arbeit mit Dokumenten ist die Suche von einzelnen oder mehreren Elementen.&lt;br /&gt;
Aufgrund dessen haben sich die Schnittstellen für die Suche im Browser über die letzten Jahre rapide verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorgefertige Kriterien===&lt;br /&gt;
&lt;br /&gt;
Die Suche nach einem eindeutigen Element kann mithilfe einer ID ausgeführt werden, insofern das HTML-Element eine besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.getElementById(&#039;inhalt&#039;);&lt;br /&gt;
console.log(inhalt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Suche wird entweder das Dokument selbst oder aber ein beliebiges Element als Ausgangspunkt verwendet.Es wird dann jeweils immer nur unterhalb des Ausgangsknotens gesucht, was sich positiv auf die Performance auswirken kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.getElementById(&#039;inhalt&#039;);&lt;br /&gt;
var kommentare = inhalt.getElementById(&#039;kommentare&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Werden Elemente einer bestimmten Art gesucht so kann der Tag-Name oder aber die HTML-Klasse als Kriterium genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var elemente = document.getElementsByTagName(&#039;body&#039;);&lt;br /&gt;
console.log(elemente);&lt;br /&gt;
&lt;br /&gt;
var kommentare = document.getElementsByClassName(&#039;kommentar&#039;);&lt;br /&gt;
console.log(kommentare.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Art von Suche wird eine &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt; als Ergebnis zurückgeliefert, ein Array-artiges Objekt von Node-Elementen.Einzelne Elemente dieser Liste können entweder über eine Funktion oder aber über einen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.getElementsByTagName(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
console.log(absaetze.item(0));&lt;br /&gt;
console.log(absaetze.item(0) == absaetze[0]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verweise===&lt;br /&gt;
Jedes Element verweist im Sinne einer Baumstruktur auf seine übergeordneten und untergeordneten Knoten und seine Nachbaren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.getElementsByTagName(&#039;body&#039;).item(0);&lt;br /&gt;
for (var i = 0; i &amp;lt; body.childNodes.length; i++) {&lt;br /&gt;
  console.log(body.childNodes[i]);&lt;br /&gt;
}&lt;br /&gt;
console.log(body.parentNode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Referenzen können genutzt werden um sich durch das Dokument zu bewegen und bestimmte Elemente zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var container = [];&lt;br /&gt;
var absaetze = document.getElementsByTagName(&#039;p&#039;);&lt;br /&gt;
for (var i = 0; i &amp;lt; absaetze.length; i++) {&lt;br /&gt;
  container.push(absaetze[i].parentNode);&lt;br /&gt;
}&lt;br /&gt;
console.log(container);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CSS-Selektoren===&lt;br /&gt;
&lt;br /&gt;
Die Suche mithilfe von vorgefertigen Kriterien und Verweisen auf benachbarte Elemente hat gewisse Limitierungen.&lt;br /&gt;
Aufgrund dessen enstand durch bekannte Bibliotheken wie jQuery das Konzept von Query-Selektoren, welche heute als &lt;br /&gt;
[http://www.w3.org/TR/CSS2/selector.html CSS-Selektoren] standardisiert werden und in vielen Browser verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Eine CSS-Selektorgruppe beschreibt eine beliebige Menge an Kriterien, die auf ein oder mehrere HTML-Elemente zutrifft.&lt;br /&gt;
Der Name wurde so gewählt da CSS-Selektoren ebenso in Stylesheets genutzt werden um eine Menge an Elementen auszuwählen.&lt;br /&gt;
Aufgrund der Kombinierbarkeit einzelner CSS-Selektoren ergibt sich eine sehr mächtige Suchfunktionalität.&lt;br /&gt;
&lt;br /&gt;
Im Browser gibt zwei verschiedene Funktionen um Elemente mithilfe von CSS-Selektoren zu suchen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelector&amp;lt;/code&amp;gt; liefert das erste Element zurück welches die Kriterien erfüllt&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelectorAll&amp;lt;/code&amp;gt; liefert alle Elemente zurück welche die Kriterien erfüllen in Form einer &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Mögliche Kriterien====&lt;br /&gt;
&lt;br /&gt;
Das einfachste Kriterium für einen CSS-Selektor ist die Angabe eines Tag-Namen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.querySelectorAll(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angabe einer ID eines HTML-Elements erfolgt durch eine vorangestellte Raute (&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.querySelector(&#039;#inhalt&#039;);&lt;br /&gt;
console.log(inhalt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klassen-Selektoren werden durch einen vorangestellten Punkt (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) gekennzeichnet. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kommentare = document.querySelectorAll(&#039;.kommentar&#039;);&lt;br /&gt;
console.log(kommentare);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von eckigen Klammern (&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;) werden beliebige Attribute als Kriterium definiert.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var textFelder = document.querySelectorAll(&#039;[type=&amp;quot;text&amp;quot;]&#039;);&lt;br /&gt;
console.log(textFelder);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird kein Attributwert vergeben, wird lediglich auf die Existenz des Attributs geprüft.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var versteckteElemente = document.querySelectorAll(&#039;[hidden]&#039;);&lt;br /&gt;
console.log(versteckteElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Mächtigkeit von CSS-Selektoren ergibt sich vor allem durch die beliebige Kombinationsmöglichkeiten von Selektoren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wichtigeKommentare = document.querySelectorAll(&#039;.kommentar.wichtig&#039;);&lt;br /&gt;
console.log(wichtigeKommentare);&lt;br /&gt;
var versteckteAbsaetze = document.querySelectorAll(&#039;p[hidden]&#039;);&lt;br /&gt;
console.log(textFelder);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist sogar möglich Kriterien für übergeordnete Elemente zu definieren indem man die Selektoren durch Leerzeichen trennt.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var versteckteElementeInnerhalbVonKommentaren = document.querySelectorAll(&#039;.kommentar [hidden]&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Komplexität einer CSS-Selektorgruppe beeinflusst die Performance einer Suche.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine vollständige Erklärung der Funktionsweise von CSS-Selektoren ist nicht Ziel dieses Tutoriums.&lt;br /&gt;
Diese Einführung dient lediglich dazu ein grundsätzliches Verständnis für den Umgang mit Selektoren zu vermitteln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hinzufügen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Neu erstellte Elemente können im Dokument als untergeordnete Knoten mithilfe von &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
document.documentElement.appendChild(absatz);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dazu muss immer der künftig übergeordnete Knoten angesprochen werden wenn das Element an einer bestimmten Stelle landen soll.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var absatz = document.querySelector(&#039;p&#039;);&lt;br /&gt;
var unterAbsatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
absatz.appendChild(unterAbsatz);    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifizieren von Elementen==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der entsprechenden DOM-Schnittstellen können Text, Attribute sowie das Styling von Elementen beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
===Ändern von Text===&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt mit nur einem &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt;-Unterknoten stellt seinen Text über der Eigenschaft &amp;lt;code&amp;gt;textContent&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var p = document.querySelector(&#039;p&#039;);&lt;br /&gt;
console.log(p.textContent);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Text kann über diese Eigenschaft nicht nur gelesen sondern ebenso beliebig modifiziert werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var p = document.querySelector(&#039;p&#039;);&lt;br /&gt;
p.textContent = &#039;Hallo Welt&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von HTML===&lt;br /&gt;
&lt;br /&gt;
Eine wesentlich mächtigere Weise um den Inhalt eines Elements zu beeinflussen stellt die Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;Hallo Welt&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neben einfachen Text-Änderungen lässt sich mithilfe dieser Eigenschaft das gesamte enthaltene HTML beeinflussen.Anstatt also mithilfe der DOM-Schnittstelle einzelne Elemente zu erzeugen kann einfach Markup als Wert zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;p&amp;gt;Hallo &amp;lt;strong&amp;gt;Welt!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von Attributen===&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die Attribute eines HTML-Elements gibt es die Funktionen &amp;lt;code&amp;gt;getAttribute()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Beide akzeptieren als erstes Argument den Namen des Attributs, der Setter akzeptiert außerdem einen zu setzenden Wert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
absatz.innerHTML = &#039;Tolle Website!&#039;;&lt;br /&gt;
absatz.setAttribute(&#039;class&#039;, &#039;kommentar&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(p);&lt;br /&gt;
&lt;br /&gt;
console.log(p.getAttribute(&#039;class&#039;));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kann mithilfe der Funktion &amp;lt;code&amp;gt;hasAttribute()&amp;lt;/code&amp;gt; nach der Existenz eines Attributs gefragt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var eingabefeld = document.querySelector(&#039;input[type=text]&#039;);&lt;br /&gt;
console.log(&#039;Ist das Eingabefeld Pflicht? &#039; + eingabefeld.hasAttribute(&#039;required&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine besondere Häufigkeit bei Attributsänderungen ist das Hinzufügen und/oder Entfernen von Klassen.&lt;br /&gt;
Dafür gibt es in neueren Browsern die Liste &amp;lt;code&amp;gt;classList&amp;lt;/code&amp;gt; auf jedem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt, welche die Arbeit erleichtert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.querySelector(&#039;p&#039;);&lt;br /&gt;
absatz.classList.push(&#039;wichtig&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von CSS-Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Neben dem Document Object Model existiert außerdem der [http://dev.w3.org/csswg/cssom/ CSS Object Model Standard] &lt;br /&gt;
welcher die Schnittstelle für den Zugriff auf CSS-Eigenschaften von DOM-Objekten standardisiert.&lt;br /&gt;
&lt;br /&gt;
Ein jedes DOM-Element vom Typ &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; besitzt eine Eigenschaft &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; welche alle CSS-Eigenschaften beherbergt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
console.log(body.style.color);&lt;br /&gt;
console.log(body.style.padding);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften spiegeln die in Stylesheets definierten Regeln wieder, jedoch inklusive dem kaskadierenden Charakter.Das heisst dass ein Element-Objekt nicht zwingend selbst eine &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; besitzt, diese jedoch für die Anzeige vererbt bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften können ebenso beliebig modifiziert werden, was zu einer sofortigen Anpassung der Darstellung führt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.style.backgroundColor = &#039;#AAF&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Ebenso wie neue Elemente einem Dokument hinzugefügt werden können, so können diese oder bestehende auch gelöscht werden.&lt;br /&gt;
Dazu muss man den übergeordneten Knoten ansteuern und mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt; die Entfernung durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var liste = document.querySelector(&#039;ul&#039;);&lt;br /&gt;
var listenelement = liste.querySelector(&#039;li&#039;);&lt;br /&gt;
liste.removeChild(listenelement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ist einem der übergeordnete Knoten nicht bekannt so kann man diesen mithilfe der Knotenverweise ermitteln.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var entferneKnoten = function(knoten) {&lt;br /&gt;
  if (!knoten.parentNode) {&lt;br /&gt;
    throw new Error(&#039;no parent node&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  knoten.parentNode.removeChild(knoten);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var listenelement = document.querySelector(&#039;li&#039;);&lt;br /&gt;
entferneKnoten(listenelement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=DOM Events=&lt;br /&gt;
&lt;br /&gt;
==Ereignisorientierte Programmierung==&lt;br /&gt;
&lt;br /&gt;
Für die Verarbeitung von stets verfügbaren Informationen eignet sich eine sequentiell ablaufende Folge von Instruktionen.&lt;br /&gt;
Ergeben sich Informationen jedoch nicht deterministisch zur Laufzeit bietet sich die ereignisorientierte Programmierung an.&lt;br /&gt;
Hierbei wird nicht mehr aktiv auf eine Information gewartet, das Programm wird benachrichtigt wenn ein Ereignis eintritt.&lt;br /&gt;
Somit gibt es nicht nur einen einzelnen Kontrollfluss, sondern beliebig viele welche sogar auch parallel ablaufen können.&lt;br /&gt;
&lt;br /&gt;
==Ereignisse im Browser==&lt;br /&gt;
&lt;br /&gt;
Bei der Betrachtung von und der Interaktion mit Websites im Browser ergeben sich sehr viele unterschiedliche Ereignisse.&lt;br /&gt;
Zunächst wird die HTML-Seite geladen und gerendert, danach geschieht dies für alle anderen referenzierten Medien.&lt;br /&gt;
Diese Vorgänge lösen bereits nicht deterministische Ereignisse aus welche alleine durch den Browser verursacht werden.&lt;br /&gt;
So gibt es für die meisten Medien ein Ereignis welches beschreibt dass diese fertig geladen und gerendert wurden.&lt;br /&gt;
&lt;br /&gt;
Sobald der Browser beginnt eine Web-Seite zu rendern können Ereignisse von Seiten des Benutzers eintreten.&lt;br /&gt;
Nahezu jede Benutzerinteraktion löst im Browser ein Ereignis aus welches wiederum in weiteren Aktionen resultiert.&lt;br /&gt;
Klickt der Benutzer auf einen Link so ist das ein Ereignis welches zur Folge hat dass die geklickte URL geladen wird.&lt;br /&gt;
Wird ein Scroll-Balken vom Benutzer bewegt ergibt sich daraus ein Ereignis welches den Browser in Folge scrollen lässt.&lt;br /&gt;
&lt;br /&gt;
Zu den wichtigsten Arten von durch den Benutzer ausgelösten Ereignissen zählen: &lt;br /&gt;
&lt;br /&gt;
* Mausbewegungen und -klicks&lt;br /&gt;
* Tastatureingaben&lt;br /&gt;
* Scrolling&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Auflistung der möglichen Ereignisse im Browser finden Sie auf [https://developer.mozilla.org/en-US/docs/Web/Events dieser] MDN-Seite. &lt;br /&gt;
Nebem dem Browser und dem Benutzer gibt es auch andere Auslöser wie zum Beispiel mit der Website verbundene Server/Backends. &lt;br /&gt;
&lt;br /&gt;
==Aufbau eines Ereignisses==&lt;br /&gt;
&lt;br /&gt;
Im Sinne einer standardisierten Ereignisverarbeitung besitzt ein im Browser auftretendes Ereignis immer drei folgende Merkmale: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Name:&#039;&#039;&#039; eine Zeichenkette die das Ereignis in der Regel in der Gegenwart beschreibt, z.B. &amp;quot;click&amp;quot; oder &amp;quot;mousemove&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Daten:&#039;&#039;&#039; ein Objekt mit einer pro Ereignis festgelegten Struktur, welches die wichtigsten Ereignisdaten enthält&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Ziel:&#039;&#039;&#039; ein Objekt das als Ziel des Ereignis festgelegt wird; in der Regel handelt es sich um DOM-Elemente&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein solches Ereignis: Eine &#039;&#039;&#039;Tastatureingabe&#039;&#039;&#039; in einem &#039;&#039;&#039;Formularfeld&#039;&#039;&#039;, bei dem das Zeichen &#039;&#039;&#039;@&#039;&#039;&#039; eingegeben wird. &lt;br /&gt;
&lt;br /&gt;
==Phasen der Ereignispropagierung==&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei dem ursprünglichen Ziel eines Ereignisses um ein DOM-Objekt werden in der Regel drei Phasen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
===Capturing-Phase===&lt;br /&gt;
&lt;br /&gt;
In Phase 1, der sogenannten &#039;&#039;&#039;Capturing-Phase&#039;&#039;&#039; wird zuerst ein Ereignis mit dem obersten Knoten im Dokument als Ziel erzeugt.&lt;br /&gt;
Dabei handelt es sich in der Regel um das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt, welches alle andere DOM-Objekte als Unterknoten enthält.&lt;br /&gt;
Das wird schrittweise wiederholt für jeden untergeordneten Knoten auf dem Pfad zum eigentlichen Ziel des Ereignisses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
+ window (optional)         - Ereignis mit window als aktueller Ziel&lt;br /&gt;
  + document                - Ereignis mit body als aktueller Ziel&lt;br /&gt;
    + body                  - Ereignis mit body als aktueller Ziel&lt;br /&gt;
      + p (ursprüngliches Ziel)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Bei manchen Ereignissen wird das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als oberstes Objekt in die Hierarchie der Ziele mit aufgenommen.&lt;br /&gt;
&lt;br /&gt;
===Target-Phase===&lt;br /&gt;
&lt;br /&gt;
Ist der Browser nun beim ursprünglichen Ziel angelangt wird in Phase 2 gewechselt, der sogenannten &#039;&#039;&#039;Target-Phase&#039;&#039;&#039;.&lt;br /&gt;
Dabei wird ein einzelnes Ereignis erzeugt, für welches das ursprüngliche DOM-Objekt als Ziel verwendet wird.&lt;br /&gt;
&lt;br /&gt;
===Bubbling-Phase===&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss der Ereignispropagierung wechselt der Browser in Phase 3, der sogenannten &#039;&#039;&#039;Bubbling-Phase&#039;&#039;&#039;.&lt;br /&gt;
Hierbei wird der Pfad der Capturing-Phase in umgekehrter Richtung durchlaufen und jeweils wieder ein Ereignis erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In Bibliotheken wie jQuery hat man nur Zugriff auf die Bubbling-Phase, nicht auf die Capturing-Phase.&lt;br /&gt;
&lt;br /&gt;
===Browser-Unterschiede===&lt;br /&gt;
&lt;br /&gt;
Die Capturing- und Bubbling-Phasen bilden in ihrer Implementierung die Tatsache ab dass &lt;br /&gt;
wenn ein Ereignis auf einem Element stattfindet, dieses Ereignis ebenso für das Element umgebende Elemente gültig ist.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wird ein Mensch in einem Krankenhaus geboren, so wird dieser auch in einer Stadt geboren, in einem Land geboren.&lt;br /&gt;
&lt;br /&gt;
Einer der beiden oben beschriebenen Phasen wäre allerdings vollkommen ausreichend für die Ereignisvearbeitung.&lt;br /&gt;
Aufgrund von unterschiedlichen Implementierungen der Browser-Hersteller existieren heutzutage jedoch beide gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
===Globale Ereignisse===&lt;br /&gt;
&lt;br /&gt;
Beschreibt ein Ereignis ein globales Geschehen wird oftmals das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als Ereignisziel verwendet.&lt;br /&gt;
In diesen Fällen ist es möglich dass weder Capturing- noch eine Bubbling-Phase durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Ergeinis &amp;quot;DOMContentLoaded&amp;quot; beschreibt, dass eine Seite abgesehen siner externen Medien fertig geladen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der DOM-Schnittstelle erhält man die Möglichkeit Ereignisse selbst zu verarbeiten und darauf zu reagieren.&lt;br /&gt;
&lt;br /&gt;
===Anmeldung===&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt; kann auf jedem DOM-Objekt, dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt und dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt aufgerufen werden.&lt;br /&gt;
Dabei ist das Objekt auf dem die Funktion aufgerufen das &#039;&#039;&#039;Ziel&#039;&#039;&#039; des Ereignisses welches verarbeiten werden soll.&lt;br /&gt;
&lt;br /&gt;
Die Funktion akzeptiert außerdem die folgenden drei Argumente: &lt;br /&gt;
* den &#039;&#039;&#039;Namen des Ereignisses&#039;&#039;&#039; das man verarbeiten möchte in Form eines Strings&lt;br /&gt;
* die &#039;&#039;&#039;Callback-Funktion&#039;&#039;&#039; welche das Ereignis-Objekt erwartet und den Code zur Verarbeitung enthält&lt;br /&gt;
* ein optionales &#039;&#039;&#039;Flag&#039;&#039;&#039; das bestimmt ob das Ereignis in der Capturing- oder Bubbling-Phase verarbeitet werden soll&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist das Flag &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, was bedeutet dass das Ereignis in der Bubbling-Phase verarbeitet wird.&lt;br /&gt;
Durch einen Aufruf wird für ein Ereignis auf einem Ziel ein sogenannter Event-Listener in Form einer Funktion angemeldet.&lt;br /&gt;
Jedes Mal wenn das Ereignis auftritt wird die Callback-Funktion aufgerufen und das entsprechende Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennSeiteGeladenIst = function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite ist nun fertig geladen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
}&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, informiereMichWennSeiteGeladenIst, false);&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a id=&amp;quot;link1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var link = document.querySelector(&#039;#link1&#039;);&lt;br /&gt;
var informiereMichWennLinkGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Der Link wurde geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
link.addEventListener(&#039;click&#039;, informiereMichWennLinkGeklicktWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Phasen der Ereignispropagierung kann man Ereignisse global verarbeiten unabhängig davon wo sie stattgefunden haben.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var informiereMichWennGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat irgendwo auf der Seite geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;click&#039;, informiereMichWennGeklicktWird);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
&lt;br /&gt;
Ein Callback ist eine Rückruffunktion welche an ein andere Funktion übergeben wird und zu späteren Zeitpunkten ggf. ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennMausBewegtWird = function() {&lt;br /&gt;
  console.log(&#039;Benutzer hat geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, informiereMichWennMausBewegtWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist jedoch nicht garantiert dass eine übergebene Callback-Funktion überhaupt jemals ausgeführt wird.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichFallsEsOktoberIst = function(event) {&lt;br /&gt;
  console.log(&#039;Es ist Oktober&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var istEsOktober = function(callback) {&lt;br /&gt;
  if (new Date().getMonth() == 9) callback();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
istEsOktober(informiereMichFallsEsOktoberIst);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Callback-Mechanismen unterstützen den Umgang mit nicht deterministischen und asynchronen Ereignissen in JavaScript.&lt;br /&gt;
&lt;br /&gt;
===Ereignis-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Event-Listener-Callback-Funktion wird beim Aufruf ein für ein Ereignis spezifisches Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
  console.log(event.screenX);&lt;br /&gt;
  console.log(event.screenY);&lt;br /&gt;
  console.log(event.button);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Objekt enthält neben spezifischen auch generelle Ereignisinformationen wie zum Beispiel das Ereignis-Ziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich der drei Phasen die ein Ereignis durchlaufen kann unterscheidet man zwischen ursprünglichem und aktuellem Ziel.Das aktuelle Ziel ist das auf welchem das Ereignis aktuell ausgelöst wird und das ursprüngliche das wo es stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target); // ursprüngliches Ziel&lt;br /&gt;
  console.log(event.currentTarget); // aktuelles Ziel&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Ziel &amp;lt;code&amp;gt;currentTarget&amp;lt;/code&amp;gt; entspricht also immer dem Objekt auf dem man den Event-Handler angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
===Abmeldung===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;removeEventListener&amp;lt;/code&amp;gt; kann ein zuvor angemeldeter Event-Listener wieder von einem Objekt entfernt werden.&lt;br /&gt;
Diese Funktion benötigt im Gegensatz zu &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt;nur zwei Argumente: Den Ereignis-Namen und die Event-Listener-Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeMausBewegungen = function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
document.removeEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Standardverhalten===&lt;br /&gt;
&lt;br /&gt;
Nachdem alle Ereignisse erzeugt und verarbeitet wurden führt der Browser gegegebenfalls eine sogenannte &amp;quot;Default Action&amp;quot; aus.&lt;br /&gt;
Im Wesentlichen ist eine solche Aktion das Standardverhalten des Browsers als Reaktion auf das eingetretene Ereignis.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Benutzer klickt auf einen Link -&amp;gt; der Browser lädt die URL&lt;br /&gt;
* Benutzer führt Tastatureingaben in einem Feld aus -&amp;gt; der Browser fügt die Zeichen dem Feld hinzu&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Event-Listener-Funktion ist es möglich mithilfe von &amp;lt;code&amp;gt;preventDefault()&amp;lt;/code&amp;gt; das Standardverhalten zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  event.preventDefault();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben dargestellte Code führt zum Beispiel dazu dass kein Klick auf einen Link die enthaltene URL aufruft.&lt;br /&gt;
&lt;br /&gt;
==Wichtige Events==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse sind die wichtigsten in der täglichen browser-seitingen Anwendungsentwicklung mit JavaScript.&lt;br /&gt;
&lt;br /&gt;
===DOMContentLoaded===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis beschreibt dass das HTML geladen und interpretiert wurde und das DOM und CSSOM erzeugt und gerendert wurde.&lt;br /&gt;
Es wird keine Aussage darüber gemacht ob weitere externe referenzierte Inhalte bereits geladen wurden, wie z.B. Bilder.&lt;br /&gt;
Das Ereignis wird direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt als Ereignisziel ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Mit der Seite kann interagiert werden&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===load===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis besagt dass die gesamte Web-Seite inklusive aller externen referenziereten Inhalte gerendert wurden.&lt;br /&gt;
Im Gegensatz zu &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; wird dieses Ereignis direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&#039;load&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite wurde vollständig geladen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===click===&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn der Benutzer (mit der Maus) auf ein sichtbares DOM-Element klickt wird dieses Ereignis ausgelöst.&lt;br /&gt;
Bei der Propagierung dieses Ereignisses werden wie alle drei Ereignisphasen (Capturing, Bubbling, Target) komplett durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat auf etwas geklickt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mousemove, mouseover, mouseout===&lt;br /&gt;
Bei Mausbewegungen über DOM-Element wird konstant das Ereignis &amp;lt;code&amp;gt;mousemove&amp;lt;/code&amp;gt; mit den entsprechenden Koordinaten erzeugt.&lt;br /&gt;
Das Ereignis &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt; wird erzeugt wenn die Maus in das Element eindringt, &amp;lt;code&amp;gt;mouseout&amp;lt;/code&amp;gt; wenn das Element wieder verlassen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseover&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus über etwas bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseout&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus von etwas weg bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===keydown, keyup, keypress===&lt;br /&gt;
&lt;br /&gt;
Bei Tastatureingaben auf einem DOM-Element durch den Benutzer werden die Ereignisse &amp;lt;code&amp;gt;keydown&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;keypress&amp;lt;/code&amp;gt; ausgelöst.&lt;br /&gt;
Die drei unterschiedlichen Ereignisse beschreiben die unterschiedlichen Phasen einer einzelnen Tastatureingabe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;keydown&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste gedrückt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keypress&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste betätigt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keyup&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste losgelassen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von DOM Events kann auch ein genereller, wiederverwendbarer Event-Mechanismus für JavaScript implementiert werden.&lt;br /&gt;
Dazu wird ein DOM-Element erzeugt, welches als virtuelles Ereignisziel dient und nicht ins Dokument eingehängt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var EventDispatcher = function() {&lt;br /&gt;
&lt;br /&gt;
  var target = document.createElement(&#039;div&#039;);&lt;br /&gt;
&lt;br /&gt;
  this.addEventListener = function(type, callback) {&lt;br /&gt;
    target.addEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.dispatchEvent = function(type, detail) {&lt;br /&gt;
    var event = new CustomEvent(type, {&lt;br /&gt;
      bubbles: true,&lt;br /&gt;
      canceable: true,&lt;br /&gt;
      detail: detail&lt;br /&gt;
    });&lt;br /&gt;
    target.dispatchEvent(event);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.removeEventListener = function(type, callback) {&lt;br /&gt;
    target.removeEventListener(type, callback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Klasse kann dann in beliebigen anderen Komponenten dazu genutzt werden um Ereignisse zu erzeugen und zu propagieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var EventBasiertesInterval = function(delay) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  self.eventDispatcher = new EventDispatcher();&lt;br /&gt;
  self._zaehler = 0;&lt;br /&gt;
&lt;br /&gt;
  setInterval(function() {&lt;br /&gt;
    self.eventDispatcher.dispatchEvent(&#039;interval&#039;, self._zaehler++);&lt;br /&gt;
  }, delay);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var interval = new EventBasiertesInterval(500);&lt;br /&gt;
interval.eventDispatcher.addEventListener(&#039;interval&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;interval &#039;, event.detail);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Timer=&lt;br /&gt;
&lt;br /&gt;
Timer in JavaScript dienen dazu um CPU-intensive Berechnungen in mehrere Teile zu spalten und um Animation zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Thread==&lt;br /&gt;
&lt;br /&gt;
Der Browser stellt für jede dargestellte Web-Seite einen einzelnen Thread zur Verfügung.&lt;br /&gt;
Dieser kümmert sich um das Rendering der Web-Seite, die Verarbeitung von Events und die Ausführung von JavaScript.&lt;br /&gt;
Mit Ausnahme des HTML5-Standards der WebWorker gibt es dementsprechend in JavaScript kein Multithreading.&lt;br /&gt;
&lt;br /&gt;
Intern bestitzt der Thread eine Liste an Aufgaben die er stets als nächstes ausführen wird, der sogenannten Queue.&lt;br /&gt;
Wird eine Web-Seite zum ersten Mal geladen verursacht dies gleich mehrere Einträge in der Queue, wie zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
* Parsen des Markups und Aufbau des DOMs&lt;br /&gt;
* Parsen des CSS und Aufbau des CSSOMs&lt;br /&gt;
* Rendering der Seite&lt;br /&gt;
* Ausführung von geladenem JavaScript-Code&lt;br /&gt;
&lt;br /&gt;
Manche Aufgaben benötigen unter Umständen viel Zeit und können so auch die Ausführung anderer Aufgaben beeinflussen.&lt;br /&gt;
Nimmt ein Stück JavaScript-Code die CPU zu lange in Anspruch kann der Browser z.B. keine Benutzereingaben mehr vearbeiten.&lt;br /&gt;
Um dies zu vermeiden ist ein Zeit- bzw. Code-Limit für JavaScript eingebaut bevor der Browser eine Warnung ausgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var wartezeitInMs = 5000;  &lt;br /&gt;
while (new Date() - programmStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Timeouts==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;setTimeout(callback, delayMs)&amp;lt;/code&amp;gt; kann man einen einmalig auszuführenden Timer auf der Thread-Queue anmelden.&lt;br /&gt;
Die übergebene Callback-Funktion wird &#039;&#039;&#039;ungefähr&#039;&#039;&#039; nach einer Wartezeit mit Länge der übergebenen Dauer ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Es werden Einträge in der Thread-Queue erzeugt die überprüfen ob es Zeit ist den Callback auszuführen und das dann ggf. tun.&lt;br /&gt;
Aufgrund der vielen Aufgaben des Threads kann die Wartezeit überschritten werden, wenn andere Aufgaben viel Zeit beanspruchen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(&#039;Nachricht &#039; + vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 500);&lt;br /&gt;
while (new Date() - programmStart &amp;lt; 1000) {&lt;br /&gt;
  // nichts tun&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Wartezeit von 0 Millisekunden heißt, dass der Interpreter die Callback-Funktion so bald wie möglich ausführen soll. &lt;br /&gt;
Abhängig von der Browser-Implementierung kann es sein dass die minimale Wartezeit aber bis zu 15 Millisekunden beträgt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var programmStart = new Date();&lt;br /&gt;
var loggeNachricht = function() {&lt;br /&gt;
  var vergangeneZeit = new Date() - programmStart;&lt;br /&gt;
  console.log(&#039;Nachricht &#039; + vergangeneZeit + &#039;ms nach Programmstart&#039;);&lt;br /&gt;
};&lt;br /&gt;
setTimeout(loggeNachricht, 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist möglich mit Timern CPU-intensive Aufgaben in mehrere Teile zu spalten oder auch Aufgaben wiederholt auszuführen.&lt;br /&gt;
Dazu erzeugt man einfach eine Funktion welche sich wiederum selbst durch einen &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt;-Aufruf als Timer registriert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll die wiederholte Ausführung beendet werden kann dies durch einen Aufruf von &amp;lt;code&amp;gt;clearTimeout(timeoutId)&amp;lt;/code&amp;gt; erreicht werden.&lt;br /&gt;
Dabei wird der Eintrag mit gegebener Timeout-ID aus der Thread-Queue gelöscht wodurch der angemeldete Timer nicht ausgeführt wird.&lt;br /&gt;
Die notwendige Timeout-ID für die Abmeldung wird beim Anmelden durch &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; als numerischer Rückgabewert bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var timeoutId = null;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
  timeoutId = setTimeout(loggeAktuelleZeit, 15);&lt;br /&gt;
};&lt;br /&gt;
loggeAktuelleZeit();&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearTimeout(timeoutId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; eignet sich vor allem für wiederholende Aufgaben welche nichts mit Rendering zu tun haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Intervalle==&lt;br /&gt;
&lt;br /&gt;
Außerdem existiert die Funktion &amp;lt;code&amp;gt;setInterval(callback, delayMs)&amp;lt;/code&amp;gt; welche einen wiederholt auszuführenden Timer regsitriert.&lt;br /&gt;
Es wird ebenso eine Callback-Funktion erwartet und eine Wartezeit zwischen den einzelnen Ausführungen des Callbacks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; wird eine Interval-ID zurückgegeben, welche für die Abmeldung mittels &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; genutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeAktuelleZeit = function() {&lt;br /&gt;
  console.log(new Date());&lt;br /&gt;
};&lt;br /&gt;
var intervalId = setInterval(loggeAktuelleZeit, 15);&lt;br /&gt;
setTimeout(function() {&lt;br /&gt;
  clearInterval(intervalId);&lt;br /&gt;
}, 2500);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst wirkt &amp;lt;code&amp;gt;setInterval()&amp;lt;/code&amp;gt; komfortabler, da der Callback nicht durch die wiederholende Timer-Registrierung verunreinigt wird.&lt;br /&gt;
Jedoch besteht bei dieser Funktion der Nachteil dass die Messung der Wartezeit &#039;&#039;&#039;vor&#039;&#039;&#039; Ausführung des Callbacks beginnt.&lt;br /&gt;
Registriert man eine Aufgabe die länger braucht als die definierte Wartezeit wird der JavaScript-Thread sehr stark beansprucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var warteEineBestimmeZeit = function() {&lt;br /&gt;
  var funktionsStart = new Date();&lt;br /&gt;
  var wartezeitInMs = 50;&lt;br /&gt;
  while (new Date() - funktionsStart &amp;lt; wartezeitInMs) {&lt;br /&gt;
    // nichts tun&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
setInterval(warteEineBestimmeZeit, 15);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obwohl der Browser zwar noch CPU-Zeit zur Verfügung hat ist er fast nur damit beschäftigt die überfälligen Callbacks auszuführen.&lt;br /&gt;
Aufgrund dessen ist es sinnvoller &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; für wiederholende Aufgaben zu verwenden deren Dauer nicht exakt vorhersehbar ist.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der vielen verschiedenen Aufgaben des JavaScript-Threads ist eine exakte Wartezeit bei Timern nicht garantiert.&lt;br /&gt;
Sollen Werte abhängig von der vergangenen Zeit verändern sollten Datum-Objekte in die Berechnungen mit einbezogen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var objekt = {position: 0, geschwindigkeitProSekunde: 1};&lt;br /&gt;
var letzterTimerAufruf = new Date();&lt;br /&gt;
var bewegeObjekt = function() {&lt;br /&gt;
  var vergangeneZeitInMs = new Date() - letzterTimerAufruf;&lt;br /&gt;
  objekt.position += geschwindigkeitProSekunde * (vergangeneZeitInMs / 1000);&lt;br /&gt;
  console.log(&#039;Aktuelle Position: &#039; + objekt.position);&lt;br /&gt;
  letzterTimerAufruf = new Date();&lt;br /&gt;
  setTimeout(bewegeObjekt, 1000);&lt;br /&gt;
};&lt;br /&gt;
bewegeObjekt();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Frames==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von &amp;lt;code&amp;gt;setTimeout()&amp;lt;/code&amp;gt; ist es möglich neben wiederholenden Aufgaben auch Animationen im Browser zu implementieren.&lt;br /&gt;
Dazu werden in der Callback-Funktion einfach die zu bewegenden Elemente entsprechend in ihrer Form und Position verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
div.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeRechteck = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  div.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  setTimeout(bewegeRechteck, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeRechteck();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird versucht dass Rechteck ca. 60 Mal in der Sekunde zu bewegen, also eine Bildwiederholrate von 60 simuliert.&lt;br /&gt;
Es kann allerdings vorkommen dass der Browser viele anderen Dingen zu tun hat und ihn ein solcher Timer zusätzlich sehr beansprucht.&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es speziell für Animationen und visuelle Änderungen die Funktion &amp;lt;code&amp;gt;requestAnimationFrame(callback)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese erwartet lediglich einen Callback und kümmert sich intern darum wann der Callback das nächste Mal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
div.setAttribute(&#039;style&#039;, &#039;width: 40px; height: 40px; background-color: #F00; position: absolute; top: 0px&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(div);&lt;br /&gt;
var xPosition = 0;&lt;br /&gt;
var bewegeRechteck = function() {&lt;br /&gt;
  xPosition = xPosition + 1;&lt;br /&gt;
  div.style.left = xPosition + &#039;px&#039;;&lt;br /&gt;
  requestAnimationFrame(bewegeRechteck, 15);&lt;br /&gt;
};&lt;br /&gt;
bewegeRechteck();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Analog zu &amp;lt;code&amp;gt;clearTimeout()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;clearInterval()&amp;lt;/code&amp;gt; gibt es die Funktion &amp;lt;code&amp;gt;cancelAnimationFrame(frameId)&amp;lt;/code&amp;gt; für die Abmeldung.&lt;br /&gt;
Diese akzeptiert eine Frame-ID welche wiederum von &amp;lt;code&amp;gt;requestAnimationFrame()&amp;lt;/code&amp;gt; zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist empfehlenswert Animation mit &amp;lt;code&amp;gt;requestAnimationFrame&amp;lt;/code&amp;gt; zu implementieren.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38262</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38262"/>
		<updated>2015-10-14T21:53:24Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Kapselung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassenorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &amp;quot;Peter&amp;quot;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht den Zugriff auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript (bis ECMAScript 5) kann man nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird erzeugt, wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext, in dem die Funktion definiert wurde, so lange erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures kann der Zugriff von Variablen innerhalb von Konstruktoren auf die inneren Funktionen beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var kuerzel = name.charAt(0);&lt;br /&gt;
  this.getKuerzel = function() {&lt;br /&gt;
    return kuerzel;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1.getKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures sind komplex und erfordern einen sicheren Umgang mit JavaScript.&lt;br /&gt;
Eine Pseudokapselung kann erreicht werden, indem man privaten Eigenschaften mit einem vorangestellten Unterstrich kennzeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this._name = name;&lt;br /&gt;
  this._punktzahl = 0;&lt;br /&gt;
  this.hatNamen = function(name) {&lt;br /&gt;
    return this._name === name;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Syntax hat keine Auswirkung auf den tatsächlichen Zugriff.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38261</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38261"/>
		<updated>2015-10-14T21:53:05Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Manipulation von this */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassenorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &amp;quot;Peter&amp;quot;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht den Zugriff auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript (bis ECMAScript 5) kann man nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird erzeugt, wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var log1 = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
log1(&#039;Hello World&#039;);&lt;br /&gt;
var log2 = erzeugeLogFunktion(&#039;Message:&#039;);&lt;br /&gt;
log2(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures kann der Zugriff von Variablen innerhalb von Konstruktoren auf die inneren Funktionen beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var kuerzel = name.charAt(0);&lt;br /&gt;
  this.hatKuerzel = function(zuPruefendesKuerzel) {&lt;br /&gt;
    return kuerzel === zuPruefendesKuerzel;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1.hatKuerzel(&#039;J&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures sind schwer zu verstehen sein und erfordern einen sicheren Umgang mit JavaScript.&lt;br /&gt;
Eine Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this._name = name;&lt;br /&gt;
  this._punktzahl = 0;&lt;br /&gt;
  this.hatNamen = function(name) {&lt;br /&gt;
    return this._name === name;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Syntax hat keine Auswirkung auf den Zugriff, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38260</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38260"/>
		<updated>2015-10-14T21:52:40Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* this */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassenorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &amp;quot;Peter&amp;quot;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt bei Aufruf die Funktion selbst aus und akzeptiert zwei Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array, welches als Liste von Argumenten für den Aufrufe verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(hoch) {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe.apply(person1, [true]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt, auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente, welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann auf unterschiedliche Arten umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(spieler, hoch) {&lt;br /&gt;
  console.log(spieler.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe(spieler1, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht den Zugriff auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript (bis ECMAScript 5) kann man nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird erzeugt, wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var log1 = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
log1(&#039;Hello World&#039;);&lt;br /&gt;
var log2 = erzeugeLogFunktion(&#039;Message:&#039;);&lt;br /&gt;
log2(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures kann der Zugriff von Variablen innerhalb von Konstruktoren auf die inneren Funktionen beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var kuerzel = name.charAt(0);&lt;br /&gt;
  this.hatKuerzel = function(zuPruefendesKuerzel) {&lt;br /&gt;
    return kuerzel === zuPruefendesKuerzel;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1.hatKuerzel(&#039;J&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures sind schwer zu verstehen sein und erfordern einen sicheren Umgang mit JavaScript.&lt;br /&gt;
Eine Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this._name = name;&lt;br /&gt;
  this._punktzahl = 0;&lt;br /&gt;
  this.hatNamen = function(name) {&lt;br /&gt;
    return this._name === name;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Syntax hat keine Auswirkung auf den Zugriff, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38259</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38259"/>
		<updated>2015-10-14T21:51:51Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* this */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassenorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &amp;quot;Peter&amp;quot;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
==Erzwingung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen, dass eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Zum Beispiel kann überprüft werden ob &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt zeigt (&amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (this === window) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Factories==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruktoren sollten nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es auch andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function(name) {&lt;br /&gt;
  return {name: name};&lt;br /&gt;
}&lt;br /&gt;
var spieler1 = erstelleSpieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt bei Aufruf die Funktion selbst aus und akzeptiert zwei Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array, welches als Liste von Argumenten für den Aufrufe verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(hoch) {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe.apply(person1, [true]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt, auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente, welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann auf unterschiedliche Arten umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(spieler, hoch) {&lt;br /&gt;
  console.log(spieler.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe(spieler1, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht den Zugriff auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript (bis ECMAScript 5) kann man nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird erzeugt, wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var log1 = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
log1(&#039;Hello World&#039;);&lt;br /&gt;
var log2 = erzeugeLogFunktion(&#039;Message:&#039;);&lt;br /&gt;
log2(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures kann der Zugriff von Variablen innerhalb von Konstruktoren auf die inneren Funktionen beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var kuerzel = name.charAt(0);&lt;br /&gt;
  this.hatKuerzel = function(zuPruefendesKuerzel) {&lt;br /&gt;
    return kuerzel === zuPruefendesKuerzel;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1.hatKuerzel(&#039;J&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures sind schwer zu verstehen sein und erfordern einen sicheren Umgang mit JavaScript.&lt;br /&gt;
Eine Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this._name = name;&lt;br /&gt;
  this._punktzahl = 0;&lt;br /&gt;
  this.hatNamen = function(name) {&lt;br /&gt;
    return this._name === name;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Syntax hat keine Auswirkung auf den Zugriff, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38258</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38258"/>
		<updated>2015-10-14T21:49:41Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Konstruktoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassenorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &amp;quot;Peter&amp;quot;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erzwingung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen, dass eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Zum Beispiel kann überprüft werden ob &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt zeigt (&amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (this === window) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Factories==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruktoren sollten nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es auch andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function(name) {&lt;br /&gt;
  return {name: name};&lt;br /&gt;
}&lt;br /&gt;
var spieler1 = erstelleSpieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt bei Aufruf die Funktion selbst aus und akzeptiert zwei Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array, welches als Liste von Argumenten für den Aufrufe verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(hoch) {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe.apply(person1, [true]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt, auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente, welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann auf unterschiedliche Arten umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(spieler, hoch) {&lt;br /&gt;
  console.log(spieler.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe(spieler1, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht den Zugriff auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript (bis ECMAScript 5) kann man nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird erzeugt, wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var log1 = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
log1(&#039;Hello World&#039;);&lt;br /&gt;
var log2 = erzeugeLogFunktion(&#039;Message:&#039;);&lt;br /&gt;
log2(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures kann der Zugriff von Variablen innerhalb von Konstruktoren auf die inneren Funktionen beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var kuerzel = name.charAt(0);&lt;br /&gt;
  this.hatKuerzel = function(zuPruefendesKuerzel) {&lt;br /&gt;
    return kuerzel === zuPruefendesKuerzel;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1.hatKuerzel(&#039;J&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures sind schwer zu verstehen sein und erfordern einen sicheren Umgang mit JavaScript.&lt;br /&gt;
Eine Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this._name = name;&lt;br /&gt;
  this._punktzahl = 0;&lt;br /&gt;
  this.hatNamen = function(name) {&lt;br /&gt;
    return this._name === name;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Syntax hat keine Auswirkung auf den Zugriff, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_4&amp;diff=38257</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 4</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_4&amp;diff=38257"/>
		<updated>2015-10-09T07:37:51Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 4=&lt;br /&gt;
&lt;br /&gt;
==Arbeiten mit Funktionen und &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es die in dem JavaScript-Tutorium vermittelten Grundlagen für&lt;br /&gt;
Funktionen, Konstruktoren und &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zu vertiefen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist fortan nicht notwendig Subversion über die Kommandozeile zu bedienen.&lt;br /&gt;
Nutzen Sie dazu einfach WebStorm oder aber TortoiseSVN bzw. svnX.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher, dass Sie die Praktikumsvorlagen auf Ihrem Rechner gespeichert haben.&lt;br /&gt;
Folgen Sie dazu der Anleitung aus Teil 1 der 1. Praktikumsaufgabe.&lt;br /&gt;
&lt;br /&gt;
Legen Sie dann einen neuen Ordner &amp;quot;aufgabe4&amp;quot; innerhalb Ihres Verzeichnis/Repositories an.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Lehrveranstaltungsordner &amp;quot;aufgabe4/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Machen Sie sich mit der Datei &amp;quot;index.js&amp;quot; vertraut und öffnen Sie die Datei &amp;quot;index.html&amp;quot; testweise im Browser.&lt;br /&gt;
Fügen Sie den Code relevant für Spieler der nachfolgenden Teilaufgaben in die Datei &amp;quot;Player.js&amp;quot; ein.&lt;br /&gt;
&lt;br /&gt;
Den Test-Code in den folgenden Abschnitten können Sie in die Datei &amp;quot;index.js&amp;quot; einpflegen um Ihre Lösungen zu validieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Spieler erstellen===&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie zunächst eine Funktion namens &amp;lt;code&amp;gt;createPlayer()&amp;lt;/code&amp;gt; die bei jedem Aufruf ein leeres Objekt erzeugt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = createPlayer();&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
&lt;br /&gt;
var player2 = createPlayer();&lt;br /&gt;
view.addObjectView(player2);&lt;br /&gt;
&lt;br /&gt;
console.log(player1 !== player2); // sollte true ergeben&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erweiteren Sie die Funktion nun so, dass sie zwei Argumente namens &amp;quot;name&amp;quot; und &amp;quot;numberOfLifes&amp;quot; akzeptiert&lt;br /&gt;
und die Werte dieser Argumente gleichnamigen Eigenschaften dem erzeugten Objekt zuweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = createPlayer(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Konstruktor für Spieler===&lt;br /&gt;
&lt;br /&gt;
Wandeln Sie die Funktion &amp;lt;code&amp;gt;createPlayer()&amp;lt;/code&amp;gt; nun in eine Konstruktorfunktion namens &amp;lt;code&amp;gt;Player()&amp;lt;/code&amp;gt; um.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player();&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Konstruktor soll nach wie vor &amp;quot;name&amp;quot; und &amp;quot;numberOfLifes&amp;quot; akzeptieren und die Werte dem neu erstellten Objekt zuweisen.&lt;br /&gt;
Die zugewiesenen Eigenschaften sollen nun allerdings mit einem Unterstrich beginnen, um sie als privat zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher, dass der Konstruktor nur mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden kann. Folgender Code sollte einen Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = Player(&#039;John&#039;, 3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leben verlieren===&lt;br /&gt;
&lt;br /&gt;
Im Laufe eines Spiels kann es passieren, dass ein Spieler ein oder mehrere seiner Leben verliert.&lt;br /&gt;
Erstellen Sie dazu auf jedem neuen Spielerobjekt die Funktion &amp;lt;code&amp;gt;loseLife()&amp;lt;/code&amp;gt;, welche die Zahl der Leben um eins reduziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
player1.loseLife(); // sollte nun 2 betragen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Namen abändern===&lt;br /&gt;
&lt;br /&gt;
Außerdem kann es sein, dass sich ein Spieler nachträglich für einen anderen Namen entscheiden möchte.&lt;br /&gt;
FÜgen Sie deshalb auf jedem neuen Spielerobjekt die Funktion &amp;lt;code&amp;gt;changeName(name)&amp;lt;/code&amp;gt; hinzu, welche den Namen des Spielers ändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
player1.changeName(&#039;James&#039;); // Name sollte nun James sein&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aktuelle Spielerinformationen===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie jedes neue Spielerobjekt um die Funktion &amp;lt;code&amp;gt;getInfo()&amp;lt;/code&amp;gt;, welche aktuelle Spielerinformationen bereitstellen soll.&lt;br /&gt;
Die Funktion liefert den Namen des Spielers und die Anzahl seiner aktuellen Leben als zusammengesetzten String zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
player1.loseLife();&lt;br /&gt;
player1.changeName(&#039;James&#039;);&lt;br /&gt;
console.log(player1.getInfo()); // gibt &#039;Spieler: James / Leben: 2&#039; aus&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Typüberprüfung===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In bestimmten Spielsituationen kann es wichtig sein zu überprüfen, ob sich bei einem Objekt um einen Spieler handelt.&lt;br /&gt;
Schreiben Sie die dazu die Funktion &amp;lt;code&amp;gt;Player.isPlayer()&amp;lt;/code&amp;gt;, welche den Typ von einem gegebenen Objekt überprüft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
console.log(Player.isPlayer(player1)); // true&lt;br /&gt;
console.log(Player.isPlayer({})); // false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38256</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38256"/>
		<updated>2015-10-07T16:49:02Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassenorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &amp;quot;Peter&amp;quot;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  return {&lt;br /&gt;
    name: vorname,&lt;br /&gt;
    punktzahl: 0&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erzwingung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen, dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (!(this instanceof Spieler)) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann überprüft werden ob &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt zeigt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (this === window) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alternative==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Wichtiger ist jedoch die effiziente Wiederverwendung wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es auch andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function(name) {&lt;br /&gt;
  return {name: name};&lt;br /&gt;
}&lt;br /&gt;
var spieler1 = erstelleSpieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für simple Datentypen funktioniert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator erwartungsgemäß.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof spieler1 ist &#039; + typeof spieler1);&lt;br /&gt;
&lt;br /&gt;
var spieler2 = null;&lt;br /&gt;
console.log(&#039;typeof spieler2 ist &#039; + typeof spieler2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(&#039;getType() von spieler1 ist &#039; + getType(spieler1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt bei Aufruf die Funktion selbst aus und akzeptiert zwei Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array, welches als Liste von Argumenten für den Aufrufe verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(hoch) {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe.apply(person1, [true]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt, auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente, welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann auf unterschiedliche Arten umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(spieler, hoch) {&lt;br /&gt;
  console.log(spieler.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe(spieler1, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht den Zugriff auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript (bis ECMAScript 5) kann man nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird erzeugt, wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var log1 = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
log1(&#039;Hello World&#039;);&lt;br /&gt;
var log2 = erzeugeLogFunktion(&#039;Message:&#039;);&lt;br /&gt;
log2(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures kann der Zugriff von Variablen innerhalb von Konstruktoren auf die inneren Funktionen beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var kuerzel = name.charAt(0);&lt;br /&gt;
  this.hatKuerzel = function(zuPruefendesKuerzel) {&lt;br /&gt;
    return kuerzel === zuPruefendesKuerzel;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1.hatKuerzel(&#039;J&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures sind schwer zu verstehen sein und erfordern einen sicheren Umgang mit JavaScript.&lt;br /&gt;
Eine Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this._name = name;&lt;br /&gt;
  this._punktzahl = 0;&lt;br /&gt;
  this.hatNamen = function(name) {&lt;br /&gt;
    return this._name === name;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Syntax hat keine Auswirkung auf den Zugriff, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_2&amp;diff=38255</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 2</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_2&amp;diff=38255"/>
		<updated>2015-10-07T14:08:06Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 2=&lt;br /&gt;
&lt;br /&gt;
==Vertiefung der JavaScript-Grundlagen==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es eine bestehende JavaScript-Logger-Anwendung zu erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist fortan nicht notwendig Subversion über die Kommandozeile zu bedienen.&lt;br /&gt;
Nutzen Sie dazu einfach WebStorm oder alternativ TortoiseSVN bzw. svnX.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher, dass Sie die Praktikumsvorlagen auf Ihrem Rechner gespeichert haben.&lt;br /&gt;
Folgen Sie dazu der Anleitung aus Teil 1 der 1. Praktikumsaufgabe.&lt;br /&gt;
&lt;br /&gt;
Legen Sie ein neues Verzeichnis &amp;quot;aufgabe2&amp;quot; innerhalb Ihres Repository-Verzeichnisses an.&lt;br /&gt;
Kopieren Sie die aus dem Lehrveranstaltung-Repository im Ordner &amp;quot;aufgabe2/vorlage&amp;quot; enthaltenen Dateien in das Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Log-Funktion verwenden===&lt;br /&gt;
&lt;br /&gt;
Wie im zweiten Teil der ersten Aufgabe wird bei dieser Aufgabe eine Logger-Funktion zur Verfügung gestellt.&lt;br /&gt;
Diese Funktion wurde aus Gründen der Modularisierung in die eigene Datei &amp;quot;log.js&amp;quot; ausgelagert.&lt;br /&gt;
Öffnen Sie diese Datei und machen Sie sich zunächst mit dem Code vertraut.&lt;br /&gt;
&lt;br /&gt;
Versuchen Sie nun herauszufinden, welche Ausgaben die einzelnen folgenden Code-Blöcke verursachen.&lt;br /&gt;
Validieren Sie Ihre Annahmen, indem Sie den Code in die &amp;quot;index.js&amp;quot; kopieren und die Seite &amp;quot;index.html&amp;quot; im Browser aufrufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
log(spielerName1);&lt;br /&gt;
var spielerName1 = &#039;Paul&#039;;&lt;br /&gt;
&lt;br /&gt;
var spielerName2 = &#039;Peter&#039;;&lt;br /&gt;
log(spielerName2);&lt;br /&gt;
&lt;br /&gt;
window.spielerName3 = &#039;Hans&#039;;&lt;br /&gt;
log(spielerName3);&lt;br /&gt;
&lt;br /&gt;
var punktzahl1;&lt;br /&gt;
log(punktzahl1);&lt;br /&gt;
&lt;br /&gt;
var punktzahl2 = 100 / &#039;a&#039;;&lt;br /&gt;
log(punktzahl2);&lt;br /&gt;
&lt;br /&gt;
var punktzahl3 = 017;&lt;br /&gt;
log(punktzahl3);&lt;br /&gt;
&lt;br /&gt;
log(1.000 == 1);&lt;br /&gt;
&lt;br /&gt;
var begruessung = &#039;Hallo Spieler!&#039; + &#039; &#039; + &#039;Start in &#039; + 5 + &#039; Sekunden&#039;;&lt;br /&gt;
log(begruessung);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Log-Funktion erweitern===&lt;br /&gt;
&lt;br /&gt;
Im Folgenden geht es darum die Funktion &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; in der Datei &amp;quot;log.js&amp;quot; zu erweitern.&lt;br /&gt;
Platzieren Sie Ihren Code direkt am Anfang der Funktion bevor der Wert von &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; in die Seite eingefügt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Leerer String====&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe des Loggers ist bei leeren Zeichenketten nicht besonders aussagekräftig.&lt;br /&gt;
Erweitern Sie den Code so, dass anstelle von leeren Zeichenketten der String &amp;quot;(empty string)&amp;quot; ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Validieren Sie die Funktionalität, indem Sie in der &amp;quot;index.js&amp;quot; &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; mit einem leeren String aufrufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Booleans, Null und Undefined====&lt;br /&gt;
&lt;br /&gt;
Auch bei den boolschen Werten &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; sowie &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; kann die Ausgabe missverständlich sein.&lt;br /&gt;
Können Sie sich denken warum?&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie den Code wie folgt:&lt;br /&gt;
* handelt es sich um einen boolschen Wert soll die Zeichenkette &amp;quot;(boolean)&amp;quot; angehängt werden&lt;br /&gt;
* handelt es sich um Null soll die Zeichenkette &amp;quot;(null)&amp;quot; angehängt werden&lt;br /&gt;
* handelt es sich um Undefined soll die Zeichenkette &amp;quot;(undefined)&amp;quot; angehängt werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Validieren Sie die Funktionalität, indem Sie in der &amp;quot;index.js&amp;quot; &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; mit den entsprechenden Werten aufrufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Aktuelles Datum====&lt;br /&gt;
&lt;br /&gt;
Bei Log-Nachrichten ist es immer sinnvoll zu wissen zu welchem Zeitpunkt diese erstellt wurden.&lt;br /&gt;
Mithilfe des Ausdrucks &amp;lt;code&amp;gt;new Date()&amp;lt;/code&amp;gt; bekommen Sie ein Datumsobjekt welches das aktuelle Datum vorhält.&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie die Log-Funktion so, dass &#039;&#039;&#039;vor&#039;&#039;&#039; jeder Nachricht das aktuelle Datum mit ausgegeben wird.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_2&amp;diff=38254</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 1:Teil 2</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_2&amp;diff=38254"/>
		<updated>2015-10-02T11:02:38Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Praktikumsaufgabe 1, Teil 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 1, Teil 2=&lt;br /&gt;
&lt;br /&gt;
==Eine erste JavaScript-Anwendung: Hello World==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist eine HTML5/JavaScript-Anwendung zu erstellen,&lt;br /&gt;
welche die Nachricht &amp;quot;Hello World&amp;quot; als Text im Browser ausgibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===HTML-Datei erstellen===&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine neue HTML-Datei mittels Rechtsklick auf den Projektordner und dann Klick auf &amp;quot;New&amp;quot; -&amp;gt; &amp;quot;HTML File&amp;quot;.&lt;br /&gt;
Benennen Sie Datei &amp;quot;index.html&amp;quot; und füllen Sie diese anschließend mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;JavaScript-Praktikum; Aufgabe 1; Teil 2&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles was an Markup benötigt wird für ein valides HTML5-Dokument.&lt;br /&gt;
Weitere Meta-Anweisungen sind durchaus sinnvoll, allerdings nicht benötigt für die folgenden Beispiele.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie die Seite im Browser mittels Rechtsklick auf die Datei und dann Klick auf &amp;quot;Open in Browser&amp;quot; -&amp;gt; &amp;quot;Firefox&amp;quot;.&lt;br /&gt;
Sie sollten eine komplett weiße Seite sehen. Sichern Sie den aktuellen Stand vom Projekt im Repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===JavaScript-Code hinzufügen===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten um ein HTML-Dokument um JavaScript-Code zu erweitern:&lt;br /&gt;
&lt;br /&gt;
* Direkte Einbettung mittels Inline-Code in einem &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/code&amp;gt;-Tag&lt;br /&gt;
* Referenzierung einer externen Datei mittels &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/code&amp;gt;-Tag&lt;br /&gt;
&lt;br /&gt;
Die direkte Einbettung von JavaScript-Code sollte wenn möglich vermieden werden.&lt;br /&gt;
Das Auslagern des Codes in eine separate Datei hat folgende Vorteile:&lt;br /&gt;
&lt;br /&gt;
* Der Code ist sauber getrennt vom HTML (Seperation of Concerns)&lt;br /&gt;
* Der JavaScript-Code kann in mehreren HTML-Dateien eingesetzt werden (Don&#039;t Repeat Yourself).&lt;br /&gt;
* Die Ladezeit der Seite ist besser, da der JavaScript-Code im Browser-Cache gespeichert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Hauptdatei erstellen====&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine neue JS-Datei mittels Rechtsklick auf den Ordner und dann Klick auf &amp;quot;New&amp;quot; -&amp;gt; &amp;quot;JavaScript File&amp;quot;.&lt;br /&gt;
Benennen Sie Datei &amp;quot;index.js&amp;quot; und fügen Sie folgenden Code in diese ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var log = function(message) {&lt;br /&gt;
  document.querySelector(&#039;.messages&#039;).innerHTML += &#039;&amp;lt;div class=&amp;quot;message&amp;quot;&amp;gt;&#039; + message + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
log(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der JavaScript-Code stellt eine Log-Funktion bereit, welche mithilfe der DOM-API Nachrichten in die Seite ausgeben kann.&lt;br /&gt;
Nach dem Laden der HTML-Seite wird der Logger initial benutzt um die Nachricht &amp;quot;Hello World&amp;quot; auszugeben.&lt;br /&gt;
&lt;br /&gt;
Ändern Sie dann das HTML-Dokument wie folgt ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;JavaScript-Praktikum; Aufgabe 1; Teil 2&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1 class=&amp;quot;headline&amp;quot;&amp;gt;Logged messages&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;index.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie die Seite erneut im Browser. Nun sollten Sie die Nachricht &amp;quot;Hello World&amp;quot; sehen.&lt;br /&gt;
Sichern Sie den aktuellen Stand im Repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Dateien aufsplitten====&lt;br /&gt;
&lt;br /&gt;
In den meisten Projekten ist es empfehlenswert, den JavaScript-Code in mehrere modulare Dateien aufzusplitten.&lt;br /&gt;
Bei der Einbindung dieser muss dann allerdings die Reihenfolge beachtet werden.&lt;br /&gt;
Der Browser lädt und evaluiert den Code in der Reihenfolge der eingebetteten &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/code&amp;gt;-Tags.&lt;br /&gt;
&lt;br /&gt;
Teilen Sie nun den Code in der Datei &amp;quot;index.js&amp;quot; so auf, dass die Log-Funktion in einer eigenen Datei &amp;quot;log.js&amp;quot; liegt.&lt;br /&gt;
Die Datei &amp;quot;index.js&amp;quot; soll also nur noch den Aufruf der Log-Funktion mit der Nachricht &amp;quot;Hello World&amp;quot; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Ändern Sie dann das HTML-Dokument wie folgt ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;JavaScript-Praktikum; Aufgabe 1; Teil 2&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1 class=&amp;quot;headline&amp;quot;&amp;gt;Logged messages&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;log.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;index.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Tauschen Sie testweise die Reihenfolge der JavaScript-Dateien. Was denken Sie, was passieren wird?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Styling===&lt;br /&gt;
&lt;br /&gt;
Um die visuelle Darstellung von HTML-Seiten zu steuern werden Cascading Style Sheets (CSS) verwendet.&lt;br /&gt;
Ebenso wie JavaScript kann CSS auf zwei Weisen in einem HTML-Dokument verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Direkte Einbettung mittels Inline-Code in einem &amp;lt;code&amp;gt;&amp;lt;style&amp;gt;&amp;lt;/code&amp;gt;-Tag&lt;br /&gt;
* Referenzierung einer externen Datei mittels &amp;lt;code&amp;gt;&amp;lt;link&amp;gt;&amp;lt;/code&amp;gt;-Tag&lt;br /&gt;
&lt;br /&gt;
Die gleichen Gründe wie bei JavaScript sprechen dafür das CSS in eine externe Datei auszulagern.&lt;br /&gt;
Legen Sie dazu eine neue CSS-Datei names &amp;lt;code&amp;gt;index.css&amp;lt;/code&amp;gt; an und fügen Sie folgenden Inhalt ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
html, body {&lt;br /&gt;
  font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.headline {&lt;br /&gt;
  font-size: 35px;&lt;br /&gt;
  font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.messages {&lt;br /&gt;
  background-color: #000;&lt;br /&gt;
  color: #FFF;&lt;br /&gt;
  padding: 20px;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.message {&lt;br /&gt;
  margin: 0 0 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.message:last-child {&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ändern Sie dann das HTML-Dokument wie folgt ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;JavaScript-Praktikum; Aufgabe 1; Teil 1&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;index.css&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1 class=&amp;quot;headline&amp;quot;&amp;gt;Logged messages&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;log.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;index.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie die Seite erneut im Browser. Diese sollte nun eine andere visuelle Darstellung aufweisen.&lt;br /&gt;
Sie können das Styling Ihren Wünschen entsprechend verändern. Sichern Sie dann den aktuellen Stand im Repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Weitere Nachrichten ausgeben===&lt;br /&gt;
&lt;br /&gt;
Die mittels JavaScript erstellte Log-Funktion bietet die Möglichkeit beliebige Nachrichten auszugeben.&lt;br /&gt;
Erweitern Sie den Code nun so, dass nach der Nachricht &amp;quot;Hello World&amp;quot; die Nachricht &amp;quot;How are you doing?&amp;quot; ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Konsole verwenden===&lt;br /&gt;
&lt;br /&gt;
In vielen Fällen kann die Browser-Konsole dabei unterstützen Fehler zu finden oder Probleme zu analysieren.&lt;br /&gt;
In den meisten Browsern finden Sie einen Einstieg in die Entwicklertools mittels Rechtsklick -&amp;gt; &amp;quot;Inspect element&amp;quot;.&lt;br /&gt;
Daraufhin öffnet sich eine Leiste mit unterschiedlichen Werkzeugen wie dem DOM Inspector und auch der Konsole.&lt;br /&gt;
&lt;br /&gt;
Die Konsole hat zwei wesentliche Kernfunktionen.&lt;br /&gt;
Zum einen stellt Sie eine JavaScript-API bereit welche Nachrichten entgegennimmt und diese dann ausgibt.&lt;br /&gt;
Dies können Informationen, Warnung und auch Fehler der aktuell geladenen Seite sein.&lt;br /&gt;
Laufzeitfehler der aktuellen Seite führen implizit zu einem Fehler-Eintrag in der Konsole.&lt;br /&gt;
Zum anderen ermöglicht die Konsole meist beliebigen JavaScript-Code im Kontext der aktuellen Seite auszuführen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie zunächst die Konsole und machen Sie sich mit der Ansicht vertraut.&lt;br /&gt;
Geben Sie anschließend in die untere Eingabezeile der Konsole &amp;lt;code&amp;gt;console.log(&#039;Hello World&#039;);&amp;lt;/code&amp;gt; ein und drücken Sie Enter.&lt;br /&gt;
Dies führt dazu dass die Nachricht &amp;quot;Hello World&amp;quot; in der Konsole ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Versuchen Sie abschließend aus der Konsole heraus das Logger-Objekt der aktuellen HTML-Seite anzusteuern und die Nachricht&lt;br /&gt;
&amp;quot;called from the console&amp;quot; auszugeben.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38253</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 1:Teil 1</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38253"/>
		<updated>2015-10-02T10:30:26Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 1, Teil 1=&lt;br /&gt;
&lt;br /&gt;
==Einrichtung der Arbeitsumgebung==&lt;br /&gt;
&lt;br /&gt;
===Ziele===&lt;br /&gt;
&lt;br /&gt;
* Installation und Konfiguration von WebStorm&lt;br /&gt;
* Checkout des Repositories der Lehrveranstaltung&lt;br /&gt;
* Checkout des eigenen Subversion-Repositories&lt;br /&gt;
* Verbinden des Repositories mit der WebStorm IDE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation von Webstorm===&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich zunächst [http://www.jetbrains.com/webstorm/ Webstorm] herunter und installieren Sie es.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Auf Rechnern der Hochschule ist Webstorm bereits vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Lizenz====&lt;br /&gt;
&lt;br /&gt;
Als Student der Hochschule Augsburg erhalten Sie mit Ihrer Hochschul-E-Mail-Adresse eine kostenlose Studentenlizenz.&lt;br /&gt;
Gehen Sie dazu auf die [https://www.jetbrains.com/estore/students/ Antragsseite] und füllen Sie das Formular aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Falls Sie an einem Rechner der Hochschule arbeiten können Sie die Hochschullizenz verwenden.&lt;br /&gt;
Bitte kontaktieren Sie den Lehrbeauftragten / Professor um den Lizenzschlüssel zu erhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IDE-Konfiguration====&lt;br /&gt;
&lt;br /&gt;
Webstorm ist auf die Entwicklung mit HTML, CSS und JavaScript ausgelegt, wodurch sich die Konfiguration einfach gestaltet.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher dass unter &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;&lt;br /&gt;
auf jeden Fall folgende Plugins aktiviert sind (diese sollte standardmäßig der Fall sein):&lt;br /&gt;
&lt;br /&gt;
* JavaScript Support&lt;br /&gt;
* Subversion Integration&lt;br /&gt;
&lt;br /&gt;
Verifizieren Sie außerdem dass unter &amp;quot;Project settings&amp;quot; -&amp;gt; &amp;quot;JavaScript&amp;quot; die &amp;quot;JavaScript language version&amp;quot; auf&lt;br /&gt;
&amp;quot;ECMAScript 5.1&amp;quot; eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Code-Style====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig sind vier Leerzeichen als Einrückung für Code-Formattierungen eingestellt.&lt;br /&gt;
Eine Vorgabe dafür gibt es nicht, die Empfehlung sind aber zwei Leerzeichen aufgrund der häufigeren Verwendung.&lt;br /&gt;
&lt;br /&gt;
Um diese Einstellung zu ändern klicken Sie jeweils auf &amp;quot;JavaScript&amp;quot;, &amp;quot;CSS&amp;quot; und &amp;quot;HTML&amp;quot; und tragen bei &amp;quot;Tab size&amp;quot;,&lt;br /&gt;
&amp;quot;Indent&amp;quot; und &amp;quot;Continuation Indent&amp;quot; die gewünsche Zahl an Leerzeichen ein.&lt;br /&gt;
&lt;br /&gt;
Vermeiden Sie in jedem Fall das Tab-Zeichen zu verwenden, da dies nicht genormt ist und je nach Betriebssystem anders aussieht.&lt;br /&gt;
&lt;br /&gt;
====Markdown====&lt;br /&gt;
&lt;br /&gt;
Die Anmerkungen zu den Praktikumsaufgaben sind im Repository als&lt;br /&gt;
[https://de.wikipedia.org/wiki/Markdown Markdown]-Dokumente abgespeichert.&lt;br /&gt;
Für Syntax Highlighting und eine Vorschauansicht müssen Sie das entsprechende Plugin installieren.&lt;br /&gt;
Dazu gehen Sie auf &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;,&lt;br /&gt;
suchen dort nach &amp;quot;Markdown support&amp;quot; und klicken anschließend auf &amp;quot;Browse&amp;quot;.&lt;br /&gt;
Es erscheint dann ein Plugin namens &amp;quot;Markdown support&amp;quot;.&lt;br /&gt;
Installieren Sie dieses und starten Webstorm danach neu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Checkout der Repositories==&lt;br /&gt;
&lt;br /&gt;
Der folgende Abschnitt beschreibt eine exemplarische Verwendung von Subversion in der Kommandozeile um&lt;br /&gt;
die für das Praktikum notwendigen Repositories auf dem lokalen Rechner einzurichten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Alternativ können Sie die folgenden Schritte auch mit TortoiseSVN, svnX oder auch&lt;br /&gt;
mit dem integrierten Subversion-Support in Webstorm durchführen.&lt;br /&gt;
&lt;br /&gt;
Es ist &#039;&#039;&#039;nicht&#039;&#039;&#039; notwendig jedes Mal die Kommandozeile zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf Windows===&lt;br /&gt;
&lt;br /&gt;
* TortoiseSVN inklusive Command Line Tools [http://glossar.hs-augsburg.de/Installation_von_Tortoise_%28Windows%29 installieren]&lt;br /&gt;
* Alternativ SlikSVN [https://sliksvn.com/ installieren]&lt;br /&gt;
* Im Explorer zum gewünschten Ordner navigieren in dem die Daten gespeichert werden sollen (z.B. C:\studium)&lt;br /&gt;
* Shift + Rechtsklick -&amp;gt; &amp;quot;Eingabeaufforderung hier öffnen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf OSX===&lt;br /&gt;
&lt;br /&gt;
* Optional: svnX [http://glossar.hs-augsburg.de/Subversion/HowTo#svnX installieren]&lt;br /&gt;
* Terminal öffnen&lt;br /&gt;
* In den gewünschen Ordner bzw. auf den Desktop gehen: &amp;lt;code&amp;gt;cd Desktop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Arbeitsschritte===&lt;br /&gt;
&lt;br /&gt;
* Ordner erstellen: &amp;lt;code&amp;gt;mkdir mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* SVN testen: &amp;lt;code&amp;gt;svn list https://praktikum.multimedia.hs-augsburg.de/svn/lawrence&amp;lt;/code&amp;gt;&lt;br /&gt;
* Falls nachgefragt wird das Zertifikat der Hochschule zu speichern, dann mit &amp;quot;p&amp;quot; bestätigen&lt;br /&gt;
* Lehrveranstaltung auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/lawrence/ lehrveranstaltung --username rz-kennung&amp;lt;/code&amp;gt;&lt;br /&gt;
* Eigenes Repository auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;aufgabe1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Initial commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;teil1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Second commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nun können Sie Webstorm öffnen und auf &amp;quot;Open Directory&amp;quot; klicken. Wählen Sie dann den Ordner &amp;quot;repository&amp;quot; aus&lt;br /&gt;
* &#039;&#039;&#039;Anmerkung für OSX:&#039;&#039;&#039; Falls Sie den Ordner auf dem Desktop erzeugt haben können Sie diesen über den Finder verschieben&lt;br /&gt;
&lt;br /&gt;
Falls Sie auf OSX ein Problem damit haben das Zertifikat zu akzeptieren führen Sie folgenden Befehl aus:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo svn list https://praktikum.multimedia.hs-augsburg.de/&amp;lt;/code&amp;gt;&lt;br /&gt;
Da der Befehl als superuser ausgeführt wird müssen Sie Ihr lokales Rechner-Passwort eingeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt aktuell halten===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie mit der Bearbeitung Ihres Projektes aufhören sollten Sie stets den aktuellen Stand in Ihrem Repository sichern.&lt;br /&gt;
Webstorm verfügt über integrierten Subversion-Support und erkennt automatisch welche Operationen auszuführen sind.&lt;br /&gt;
Das bedeutet es ist &#039;&#039;&#039;nicht notwendig alle SVN-Befehle immer manuell über das Terminal auszuführen&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Verschieben oder Löschen Sie keine Dateien im Explorer/Finder ohne die entsprechenden SVN-Operationen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nach Änderungen den Commit-Dialog:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Commit Directory&amp;quot;&lt;br /&gt;
* Verifizieren, dass alle zu speicherenden Dateien angehakt sind&lt;br /&gt;
* Eine entsprechende Commit-Message eingeben&lt;br /&gt;
* &amp;quot;OK&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine rot markierte Datei bedeutet, dass WebStorm diese nicht als Teil des Repositories erkennt.&lt;br /&gt;
Machen Sie dann einen Rechtsklick auf die Datei und wählen &amp;quot;SVN&amp;quot; -&amp;gt; &amp;quot;Add...&amp;quot; aus um die Datei hinzuzufügen.&lt;br /&gt;
Beim &#039;&#039;&#039;nächsten Commit&#039;&#039;&#039; wird die Datei dann mit auf den SVN-Server übertragen.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie auf einem anderen Rechner an diesem Projekt weiterarbeiten wollen,&lt;br /&gt;
müssen sie beim ersten Mal das Projekt in der oben beschriebenen Weise aus dem Repository auf Ihren Rechner laden.&lt;br /&gt;
Wenn Sie dies einmal gemacht haben, reicht es wenn Sie künftig die lokale Version wie folgt aktualisieren,&lt;br /&gt;
bevor Sie mit der Arbeit beginnen:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Update Directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Repository im Browser einsehen===&lt;br /&gt;
&lt;br /&gt;
Sie können Ihr Repository jederzeit im Browser einsehen und so verifizieren, dass der aktuelle Stand online ist.&lt;br /&gt;
Rufen Sie dazu folgende URL auf: &amp;lt;code&amp;gt;https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38252</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 1:Teil 1</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38252"/>
		<updated>2015-10-02T10:18:05Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 1, Teil 1=&lt;br /&gt;
&lt;br /&gt;
==Einrichtung der Arbeitsumgebung==&lt;br /&gt;
&lt;br /&gt;
===Ziele===&lt;br /&gt;
&lt;br /&gt;
* Installation und Konfiguration von WebStorm&lt;br /&gt;
* Checkout des Repositories der Lehrveranstaltung&lt;br /&gt;
* Checkout des eigenen Subversion-Repositories&lt;br /&gt;
* Verbinden des Repositories mit der WebStorm IDE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation von Webstorm===&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich zunächst [http://www.jetbrains.com/webstorm/ Webstorm] herunter und installieren Sie es.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Auf Rechnern der Hochschule ist Webstorm bereits vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Lizenz====&lt;br /&gt;
&lt;br /&gt;
Als Student der Hochschule Augsburg erhalten Sie mit Ihrer Hochschul-E-Mail-Adresse eine kostenlose Studentenlizenz.&lt;br /&gt;
Gehen Sie dazu auf die [https://www.jetbrains.com/estore/students/ Antragsseite] und füllen Sie das Formular aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Falls Sie an einem Rechner der Hochschule arbeiten können Sie die Hochschullizenz verwenden.&lt;br /&gt;
Bitte kontaktieren Sie den Lehrbeauftragten / Professor um den Lizenzschlüssel zu erhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IDE-Konfiguration====&lt;br /&gt;
&lt;br /&gt;
Webstorm ist auf die Entwicklung mit HTML, CSS und JavaScript ausgelegt, wodurch sich die Konfiguration einfach gestaltet.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher dass unter &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;&lt;br /&gt;
auf jeden Fall folgende Plugins aktiviert sind (diese sollte standardmäßig der Fall sein):&lt;br /&gt;
&lt;br /&gt;
* JavaScript Support&lt;br /&gt;
* Subversion Integration&lt;br /&gt;
&lt;br /&gt;
Verifizieren Sie außerdem dass unter &amp;quot;Project settings&amp;quot; -&amp;gt; &amp;quot;JavaScript&amp;quot; die &amp;quot;JavaScript language version&amp;quot; auf&lt;br /&gt;
&amp;quot;ECMAScript 5.1&amp;quot; eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Code-Style====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig sind vier Leerzeichen als Einrückung für Code-Formattierungen eingestellt.&lt;br /&gt;
Eine Vorgabe dafür gibt es nicht, die Empfehlung sind aber zwei Leerzeichen aufgrund der häufigeren Verwendung.&lt;br /&gt;
&lt;br /&gt;
Um diese Einstellung zu ändern klicken Sie jeweils auf &amp;quot;JavaScript&amp;quot;, &amp;quot;CSS&amp;quot; und &amp;quot;HTML&amp;quot; und tragen bei &amp;quot;Tab size&amp;quot;,&lt;br /&gt;
&amp;quot;Indent&amp;quot; und &amp;quot;Continuation Indent&amp;quot; die gewünsche Zahl an Leerzeichen ein.&lt;br /&gt;
&lt;br /&gt;
Vermeiden Sie in jedem Fall das Tab-Zeichen zu verwenden, da dies nicht genormt ist und je nach Betriebssystem anders aussieht.&lt;br /&gt;
&lt;br /&gt;
====Markdown====&lt;br /&gt;
&lt;br /&gt;
Die Anmerkungen zu den Praktikumsaufgaben sind im Repository als&lt;br /&gt;
[https://de.wikipedia.org/wiki/Markdown Markdown]-Dokumente abgespeichert.&lt;br /&gt;
Für Syntax Highlighting und eine Vorschauansicht müssen Sie das entsprechende Plugin installieren.&lt;br /&gt;
Dazu gehen Sie auf &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;,&lt;br /&gt;
suchen dort nach &amp;quot;Markdown support&amp;quot; und klicken anschließend auf &amp;quot;Browse&amp;quot;.&lt;br /&gt;
Es erscheint dann ein Plugin namens &amp;quot;Markdown support&amp;quot;.&lt;br /&gt;
Installieren Sie dieses und starten Webstorm danach neu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Checkout der Repositories==&lt;br /&gt;
&lt;br /&gt;
Der folgende Abschnitt beschreibt eine exemplarische Verwendung von Subversion in der Kommandozeile um&lt;br /&gt;
die für das Praktikum notwendigen Repositories auf dem lokalen Rechner einzurichten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Alternativ können Sie die folgenden Schritte auch mit TortoiseSVN, svnX oder auch&lt;br /&gt;
mit dem integrierten Subversion-Support in Webstorm durchführen.&lt;br /&gt;
&lt;br /&gt;
Es ist &#039;&#039;&#039;nicht&#039;&#039;&#039; notwendig jedes Mal die Kommandozeile zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf Windows===&lt;br /&gt;
&lt;br /&gt;
* TortoiseSVN inklusive Command Line Tools [http://glossar.hs-augsburg.de/Installation_von_Tortoise_%28Windows%29 installieren]&lt;br /&gt;
* Alternativ SlikSVN [https://sliksvn.com/ installieren]&lt;br /&gt;
* Im Explorer zum gewünschten Ordner navigieren in dem die Daten gespeichert werden sollen (z.B. C:\studium)&lt;br /&gt;
* Shift + Rechtsklick -&amp;gt; &amp;quot;Eingabeaufforderung hier öffnen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf OSX===&lt;br /&gt;
&lt;br /&gt;
* Optional: svnX [http://glossar.hs-augsburg.de/Subversion/HowTo#svnX installieren]&lt;br /&gt;
* Terminal öffnen&lt;br /&gt;
* In den gewünschen Ordner bzw. auf den Desktop gehen: &amp;lt;code&amp;gt;cd Desktop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Arbeitsschritte===&lt;br /&gt;
&lt;br /&gt;
* Ordner erstellen: &amp;lt;code&amp;gt;mkdir mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* SVN testen: &amp;lt;code&amp;gt;svn list https://praktikum.multimedia.hs-augsburg.de/svn/lawrence&amp;lt;/code&amp;gt;&lt;br /&gt;
* Falls nachgefragt wird das Zertifikat der Hochschule zu speichern, dann mit &amp;quot;p&amp;quot; bestätigen&lt;br /&gt;
* Lehrveranstaltung auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/lawrence/ lehrveranstaltung --username rz-kennung&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner verlassen: &amp;lt;code&amp;gt;cd ..&amp;lt;/code&amp;gt;&lt;br /&gt;
* Eigenes Repository auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;aufgabe1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Initial commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;teil1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Second commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nun können Sie Webstorm öffnen und auf &amp;quot;Open Directory&amp;quot; klicken. Wählen Sie dann den Ordner &amp;quot;repository&amp;quot; aus&lt;br /&gt;
* &#039;&#039;&#039;Anmerkung für OSX:&#039;&#039;&#039; Falls Sie den Ordner auf dem Desktop erzeugt haben können Sie diesen über den Finder verschieben&lt;br /&gt;
&lt;br /&gt;
Falls Sie auf OSX ein Problem damit haben das Zertifikat zu akzeptieren führen Sie folgenden Befehl aus:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo svn list https://praktikum.multimedia.hs-augsburg.de/&amp;lt;/code&amp;gt;&lt;br /&gt;
Da der Befehl als superuser ausgeführt wird müssen Sie Ihr lokales Rechner-Passwort eingeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt aktuell halten===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie mit der Bearbeitung Ihres Projektes aufhören sollten Sie stets den aktuellen Stand in Ihrem Repository sichern.&lt;br /&gt;
Webstorm verfügt über integrierten Subversion-Support und erkennt automatisch welche Operationen auszuführen sind.&lt;br /&gt;
Das bedeutet es ist &#039;&#039;&#039;nicht notwendig alle SVN-Befehle immer manuell über das Terminal auszuführen&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Verschieben oder Löschen Sie keine Dateien im Explorer/Finder ohne die entsprechenden SVN-Operationen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nach Änderungen den Commit-Dialog:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Commit Directory&amp;quot;&lt;br /&gt;
* Verifizieren, dass alle zu speicherenden Dateien angehakt sind&lt;br /&gt;
* Eine entsprechende Commit-Message eingeben&lt;br /&gt;
* &amp;quot;OK&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine rot markierte Datei bedeutet, dass WebStorm diese nicht als Teil des Repositories erkennt.&lt;br /&gt;
Machen Sie dann einen Rechtsklick auf die Datei und wählen &amp;quot;SVN&amp;quot; -&amp;gt; &amp;quot;Add...&amp;quot; aus um die Datei hinzuzufügen.&lt;br /&gt;
Beim &#039;&#039;&#039;nächsten Commit&#039;&#039;&#039; wird die Datei dann mit auf den SVN-Server übertragen.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie auf einem anderen Rechner an diesem Projekt weiterarbeiten wollen,&lt;br /&gt;
müssen sie beim ersten Mal das Projekt in der oben beschriebenen Weise aus dem Repository auf Ihren Rechner laden.&lt;br /&gt;
Wenn Sie dies einmal gemacht haben, reicht es wenn Sie künftig die lokale Version wie folgt aktualisieren,&lt;br /&gt;
bevor Sie mit der Arbeit beginnen:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Update Directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Repository im Browser einsehen===&lt;br /&gt;
&lt;br /&gt;
Sie können Ihr Repository jederzeit im Browser einsehen und so verifizieren, dass der aktuelle Stand online ist.&lt;br /&gt;
Rufen Sie dazu folgende URL auf: &amp;lt;code&amp;gt;https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38251</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 1:Teil 1</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38251"/>
		<updated>2015-10-02T08:47:02Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 1, Teil 1=&lt;br /&gt;
&lt;br /&gt;
==Einrichtung der Arbeitsumgebung==&lt;br /&gt;
&lt;br /&gt;
===Ziele===&lt;br /&gt;
&lt;br /&gt;
* Installation und Konfiguration von WebStorm&lt;br /&gt;
* Checkout des Repositories der Lehrveranstaltung&lt;br /&gt;
* Checkout des eigenen Subversion-Repositories&lt;br /&gt;
* Verbinden des Repositories mit der WebStorm IDE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation von Webstorm===&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich zunächst [http://www.jetbrains.com/webstorm/ Webstorm] herunter und installieren Sie es.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Auf Rechnern der Hochschule ist Webstorm bereits vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Lizenz====&lt;br /&gt;
&lt;br /&gt;
Als Student der Hochschule Augsburg erhalten Sie mit Ihrer Hochschul-E-Mail-Adresse eine kostenlose Studentenlizenz.&lt;br /&gt;
Gehen Sie dazu auf die [https://www.jetbrains.com/estore/students/ Antragsseite] und füllen Sie das Formular aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Falls Sie an einem Rechner der Hochschule arbeiten können Sie die Hochschullizenz verwenden.&lt;br /&gt;
Bitte kontaktieren Sie den Lehrbeauftragten / Professor um den Lizenzschlüssel zu erhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IDE-Konfiguration====&lt;br /&gt;
&lt;br /&gt;
Webstorm ist auf die Entwicklung mit HTML, CSS und JavaScript ausgelegt, wodurch sich die Konfiguration einfach gestaltet.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher dass unter &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;&lt;br /&gt;
auf jeden Fall folgende Plugins aktiviert sind (diese sollte standardmäßig der Fall sein):&lt;br /&gt;
&lt;br /&gt;
* JavaScript Support&lt;br /&gt;
* Subversion Integration&lt;br /&gt;
&lt;br /&gt;
Verifizieren Sie außerdem dass unter &amp;quot;Project settings&amp;quot; -&amp;gt; &amp;quot;JavaScript&amp;quot; die &amp;quot;JavaScript language version&amp;quot; auf&lt;br /&gt;
&amp;quot;ECMAScript 5.1&amp;quot; eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Code-Style====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig sind vier Leerzeichen als Einrückung für Code-Formattierungen eingestellt.&lt;br /&gt;
Eine Vorgabe dafür gibt es nicht, die Empfehlung sind aber zwei Leerzeichen aufgrund der häufigeren Verwendung.&lt;br /&gt;
&lt;br /&gt;
Um diese Einstellung zu ändern klicken Sie jeweils auf &amp;quot;JavaScript&amp;quot;, &amp;quot;CSS&amp;quot; und &amp;quot;HTML&amp;quot; und tragen bei &amp;quot;Tab size&amp;quot;,&lt;br /&gt;
&amp;quot;Indent&amp;quot; und &amp;quot;Continuation Indent&amp;quot; die gewünsche Zahl an Leerzeichen ein.&lt;br /&gt;
&lt;br /&gt;
Vermeiden Sie in jedem Fall das Tab-Zeichen zu verwenden, da dies nicht genormt ist und je nach Betriebssystem anders aussieht.&lt;br /&gt;
&lt;br /&gt;
====Markdown====&lt;br /&gt;
&lt;br /&gt;
Die Anmerkungen zu den Praktikumsaufgaben sind im Repository als&lt;br /&gt;
[https://de.wikipedia.org/wiki/Markdown Markdown]-Dokumente abgespeichert.&lt;br /&gt;
Für Syntax Highlighting und eine Vorschauansicht müssen Sie das entsprechende Plugin installieren.&lt;br /&gt;
Dazu gehen Sie auf &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;,&lt;br /&gt;
suchen dort nach &amp;quot;Markdown support&amp;quot; und klicken anschließend auf &amp;quot;Browse&amp;quot;.&lt;br /&gt;
Es erscheint dann ein Plugin namens &amp;quot;Markdown support&amp;quot;.&lt;br /&gt;
Installieren Sie dieses und starten Webstorm danach neu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Checkout der Repositories==&lt;br /&gt;
&lt;br /&gt;
Der folgende Abschnitt beschreibt eine exemplarische Verwendung von Subversion in der Kommandozeile um&lt;br /&gt;
die für das Praktikum notwendigen Repositories auf dem lokalen Rechner einzurichten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Alternativ können Sie die folgenden Schritte auch mit TortoiseSVN, svnX oder auch&lt;br /&gt;
mit dem integrierten Subversion-Support in Webstorm durchführen.&lt;br /&gt;
&lt;br /&gt;
Es ist &#039;&#039;&#039;nicht&#039;&#039;&#039; notwendig jedes Mal die Kommandozeile zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf Windows===&lt;br /&gt;
&lt;br /&gt;
* TortoiseSVN inklusive Command Line Tools [http://glossar.hs-augsburg.de/Installation_von_Tortoise_%28Windows%29 installieren]&lt;br /&gt;
* Alternativ SlikSVN [https://sliksvn.com/ installieren]&lt;br /&gt;
* Im Explorer zum gewünschten Ordner navigieren in dem die Daten gespeichert werden sollen (z.B. C:\studium)&lt;br /&gt;
* Shift + Rechtsklick -&amp;gt; &amp;quot;Eingabeaufforderung hier öffnen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf OSX===&lt;br /&gt;
&lt;br /&gt;
* Optional: svnX [http://glossar.hs-augsburg.de/Subversion/HowTo#svnX installieren]&lt;br /&gt;
* Terminal öffnen&lt;br /&gt;
* In den gewünschen Ordner bzw. auf den Desktop gehen: &amp;lt;code&amp;gt;cd Desktop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Arbeitsschritte===&lt;br /&gt;
&lt;br /&gt;
* Ordner erstellen: &amp;lt;code&amp;gt;mkdir mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* SVN testen: &amp;lt;code&amp;gt;svn list https://praktikum.multimedia.hs-augsburg.de/svn/lawrence&amp;lt;/code&amp;gt;&lt;br /&gt;
* Falls nachgefragt wird das Zertifikat der Hochschule zu speichern, dann mit &amp;quot;p&amp;quot; bestätigen&lt;br /&gt;
* Lehrveranstaltung auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/lawrence/ lehrveranstaltung --username rz-kennung&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner verlassen: &amp;lt;code&amp;gt;cd ..&amp;lt;/code&amp;gt;&lt;br /&gt;
* Eigenes Repository auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;aufgabe1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Initial commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;teil1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Second commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nun können Sie Webstorm öffnen und auf &amp;quot;Open Directory&amp;quot; klicken. Wählen Sie dann den Ordner &amp;quot;aufgabe1&amp;quot; aus&lt;br /&gt;
* &#039;&#039;&#039;Anmerkung für OSX:&#039;&#039;&#039; Falls Sie den Ordner auf dem Desktop erzeugt haben können Sie diesen über den Finder verschieben&lt;br /&gt;
&lt;br /&gt;
Falls Sie auf OSX ein Problem damit haben das Zertifikat zu akzeptieren führen Sie folgenden Befehl aus:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo svn list https://praktikum.multimedia.hs-augsburg.de/&amp;lt;/code&amp;gt;&lt;br /&gt;
Da der Befehl als superuser ausgeführt wird müssen Sie Ihr lokales Rechner-Passwort eingeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt aktuell halten===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie mit der Bearbeitung Ihres Projektes aufhören sollten Sie stets den aktuellen Stand in Ihrem Repository sichern.&lt;br /&gt;
Webstorm verfügt über integrierten Subversion-Support und erkennt automatisch welche Operationen auszuführen sind.&lt;br /&gt;
Das bedeutet es ist &#039;&#039;&#039;nicht notwendig alle SVN-Befehle immer manuell über das Terminal auszuführen&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Verschieben oder Löschen Sie keine Dateien im Explorer/Finder ohne die entsprechenden SVN-Operationen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nach Änderungen den Commit-Dialog:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Commit Directory&amp;quot;&lt;br /&gt;
* Verifizieren, dass alle zu speicherenden Dateien angehakt sind&lt;br /&gt;
* Eine entsprechende Commit-Message eingeben&lt;br /&gt;
* &amp;quot;OK&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine rot markierte Datei bedeutet, dass WebStorm diese nicht als Teil des Repositories erkennt.&lt;br /&gt;
Machen Sie dann einen Rechtsklick auf die Datei und wählen &amp;quot;SVN&amp;quot; -&amp;gt; &amp;quot;Add...&amp;quot; aus um die Datei hinzuzufügen.&lt;br /&gt;
Beim &#039;&#039;&#039;nächsten Commit&#039;&#039;&#039; wird die Datei dann mit auf den SVN-Server übertragen.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie auf einem anderen Rechner an diesem Projekt weiterarbeiten wollen,&lt;br /&gt;
müssen sie beim ersten Mal das Projekt in der oben beschriebenen Weise aus dem Repository auf Ihren Rechner laden.&lt;br /&gt;
Wenn Sie dies einmal gemacht haben, reicht es wenn Sie künftig die lokale Version wie folgt aktualisieren,&lt;br /&gt;
bevor Sie mit der Arbeit beginnen:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Update Directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Repository im Browser einsehen===&lt;br /&gt;
&lt;br /&gt;
Sie können Ihr Repository jederzeit im Browser einsehen und so verifizieren, dass der aktuelle Stand online ist.&lt;br /&gt;
Rufen Sie dazu folgende URL auf: &amp;lt;code&amp;gt;https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38250</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 1:Teil 1</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38250"/>
		<updated>2015-10-02T08:42:50Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 1, Teil 1=&lt;br /&gt;
&lt;br /&gt;
==Einrichtung der Arbeitsumgebung==&lt;br /&gt;
&lt;br /&gt;
===Ziele===&lt;br /&gt;
&lt;br /&gt;
* Installation und Konfiguration von WebStorm&lt;br /&gt;
* Checkout des Repositories der Lehrveranstaltung&lt;br /&gt;
* Checkout des eigenen Subversion-Repositories&lt;br /&gt;
* Verbinden des Repositories mit der WebStorm IDE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation von Webstorm===&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich zunächst [http://www.jetbrains.com/webstorm/ Webstorm] herunter und installieren Sie es.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Auf Rechnern der Hochschule ist Webstorm bereits vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Lizenz====&lt;br /&gt;
&lt;br /&gt;
Als Student der Hochschule Augsburg erhalten Sie mit Ihrer Hochschul-E-Mail-Adresse eine kostenlose Studentenlizenz.&lt;br /&gt;
Gehen Sie dazu auf die [https://www.jetbrains.com/estore/students/ Antragsseite] und füllen Sie das Formular aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Falls Sie an einem Rechner der Hochschule arbeiten können Sie die Hochschullizenz verwenden.&lt;br /&gt;
Bitte kontaktieren Sie den Lehrbeauftragten / Professor um den Lizenzschlüssel zu erhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IDE-Konfiguration====&lt;br /&gt;
&lt;br /&gt;
Webstorm ist auf die Entwicklung mit HTML, CSS und JavaScript ausgelegt, wodurch sich die Konfiguration einfach gestaltet.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher dass unter &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;&lt;br /&gt;
auf jeden Fall folgende Plugins aktiviert sind (diese sollte standardmäßig der Fall sein):&lt;br /&gt;
&lt;br /&gt;
* JavaScript Support&lt;br /&gt;
* Subversion Integration&lt;br /&gt;
&lt;br /&gt;
Verifizieren Sie außerdem dass unter &amp;quot;Project settings&amp;quot; -&amp;gt; &amp;quot;JavaScript&amp;quot; die &amp;quot;JavaScript language version&amp;quot; auf&lt;br /&gt;
&amp;quot;ECMAScript 5.1&amp;quot; eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Code-Style====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig sind vier Leerzeichen als Einrückung für Code-Formattierungen eingestellt.&lt;br /&gt;
Eine Vorgabe dafür gibt es nicht, die Empfehlung sind aber zwei Leerzeichen aufgrund der häufigeren Verwendung.&lt;br /&gt;
&lt;br /&gt;
Um diese Einstellung zu ändern klicken Sie jeweils auf &amp;quot;JavaScript&amp;quot;, &amp;quot;CSS&amp;quot; und &amp;quot;HTML&amp;quot; und tragen bei &amp;quot;Tab size&amp;quot;,&lt;br /&gt;
&amp;quot;Indent&amp;quot; und &amp;quot;Continuation Indent&amp;quot; die gewünsche Zahl an Leerzeichen ein.&lt;br /&gt;
&lt;br /&gt;
Vermeiden Sie in jedem Fall das Tab-Zeichen zu verwenden, da dies nicht genormt ist und je nach Betriebssystem anders aussieht.&lt;br /&gt;
&lt;br /&gt;
====Markdown====&lt;br /&gt;
&lt;br /&gt;
Die Anmerkungen zu den Praktikumsaufgaben sind im Repository als&lt;br /&gt;
[https://de.wikipedia.org/wiki/Markdown Markdown]-Dokumente abgespeichert.&lt;br /&gt;
Für Syntax Highlighting und eine Vorschauansicht müssen Sie das entsprechende Plugin installieren.&lt;br /&gt;
Dazu gehen Sie auf &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;,&lt;br /&gt;
suchen dort nach &amp;quot;Markdown support&amp;quot; und klicken anschließend auf &amp;quot;Browse&amp;quot;.&lt;br /&gt;
Es erscheint dann ein Plugin namens &amp;quot;Markdown support&amp;quot;.&lt;br /&gt;
Installieren Sie dieses und starten Webstorm danach neu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Checkout der Repositories==&lt;br /&gt;
&lt;br /&gt;
Der folgende Abschnitt beschreibt eine exemplarische Verwendung von Subversion in der Kommandozeile um&lt;br /&gt;
die für das Praktikum notwendigen Repositories auf dem lokalen Rechner einzurichten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Alternativ können Sie die folgenden Schritte auch mit TortoiseSVN, svnX oder auch&lt;br /&gt;
mit dem integrierten Subversion-Support in Webstorm durchführen.&lt;br /&gt;
&lt;br /&gt;
Es ist &#039;&#039;&#039;nicht&#039;&#039;&#039; notwendig jedes Mal die Kommandozeile zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf Windows===&lt;br /&gt;
&lt;br /&gt;
* TortoiseSVN inklusive Command Line Tools [http://glossar.hs-augsburg.de/Installation_von_Tortoise_%28Windows%29 installieren]&lt;br /&gt;
* Alternativ SlikSVN [https://sliksvn.com/ installieren]&lt;br /&gt;
* Im Explorer zum gewünschten Ordner navigieren in dem die Daten gespeichert werden sollen (z.B. C:\studium)&lt;br /&gt;
* Shift + Rechtsklick -&amp;gt; &amp;quot;Eingabeaufforderung hier öffnen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf OSX===&lt;br /&gt;
&lt;br /&gt;
* Optional: svnX [http://glossar.hs-augsburg.de/Subversion/HowTo#svnX installieren]&lt;br /&gt;
* Terminal öffnen&lt;br /&gt;
* In den gewünschen Ordner bzw. auf den Desktop gehen: &amp;lt;code&amp;gt;cd Desktop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Arbeitsschritte===&lt;br /&gt;
&lt;br /&gt;
* Ordner erstellen: &amp;lt;code&amp;gt;mkdir mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* SVN testen: &amp;lt;code&amp;gt;svn list https://praktikum.multimedia.hs-augsburg.de/&amp;lt;/code&amp;gt;&lt;br /&gt;
* Falls nachgefragt wird das Zertifikat der Hochschule zu speichern, dann mit &amp;quot;p&amp;quot; bestätigen&lt;br /&gt;
* Lehrveranstaltung auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/lawrence/ lehrveranstaltung --username rz-kennung&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner verlassen: &amp;lt;code&amp;gt;cd ..&amp;lt;/code&amp;gt;&lt;br /&gt;
* Eigenes Repository auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;aufgabe1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Initial commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;teil1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Second commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nun können Sie Webstorm öffnen und auf &amp;quot;Open Directory&amp;quot; klicken. Wählen Sie dann den Ordner &amp;quot;aufgabe1&amp;quot; aus&lt;br /&gt;
* &#039;&#039;&#039;Anmerkung für OSX:&#039;&#039;&#039; Falls Sie den Ordner auf dem Desktop erzeugt haben können Sie diesen über den Finder verschieben&lt;br /&gt;
&lt;br /&gt;
Falls Sie auf OSX ein Problem damit haben das Zertifikat zu akzeptieren führen Sie folgenden Befehl aus:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo svn list https://praktikum.multimedia.hs-augsburg.de/&amp;lt;/code&amp;gt;&lt;br /&gt;
Da der Befehl als superuser ausgeführt wird müssen Sie Ihr lokales Rechner-Passwort eingeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt aktuell halten===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie mit der Bearbeitung Ihres Projektes aufhören sollten Sie stets den aktuellen Stand in Ihrem Repository sichern.&lt;br /&gt;
Webstorm verfügt über integrierten Subversion-Support und erkennt automatisch welche Operationen auszuführen sind.&lt;br /&gt;
Das bedeutet es ist &#039;&#039;&#039;nicht notwendig alle SVN-Befehle immer manuell über das Terminal auszuführen&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Verschieben oder Löschen Sie keine Dateien im Explorer/Finder ohne die entsprechenden SVN-Operationen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nach Änderungen den Commit-Dialog:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Commit Directory&amp;quot;&lt;br /&gt;
* Verifizieren, dass alle zu speicherenden Dateien angehakt sind&lt;br /&gt;
* Eine entsprechende Commit-Message eingeben&lt;br /&gt;
* &amp;quot;OK&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine rot markierte Datei bedeutet, dass WebStorm diese nicht als Teil des Repositories erkennt.&lt;br /&gt;
Machen Sie dann einen Rechtsklick auf die Datei und wählen &amp;quot;SVN&amp;quot; -&amp;gt; &amp;quot;Add...&amp;quot; aus um die Datei hinzuzufügen.&lt;br /&gt;
Beim &#039;&#039;&#039;nächsten Commit&#039;&#039;&#039; wird die Datei dann mit auf den SVN-Server übertragen.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie auf einem anderen Rechner an diesem Projekt weiterarbeiten wollen,&lt;br /&gt;
müssen sie beim ersten Mal das Projekt in der oben beschriebenen Weise aus dem Repository auf Ihren Rechner laden.&lt;br /&gt;
Wenn Sie dies einmal gemacht haben, reicht es wenn Sie künftig die lokale Version wie folgt aktualisieren,&lt;br /&gt;
bevor Sie mit der Arbeit beginnen:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Update Directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Repository im Browser einsehen===&lt;br /&gt;
&lt;br /&gt;
Sie können Ihr Repository jederzeit im Browser einsehen und so verifizieren, dass der aktuelle Stand online ist.&lt;br /&gt;
Rufen Sie dazu folgende URL auf: &amp;lt;code&amp;gt;https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Installation_von_WebStorm&amp;diff=38249</id>
		<title>Installation von WebStorm</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Installation_von_WebStorm&amp;diff=38249"/>
		<updated>2015-10-02T08:40:35Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Installation von Webstorm=&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich zunächst Webstorm herunter und installieren Sie es: http://www.jetbrains.com/webstorm/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Auf Rechnern der Hochschule ist Webstorm bereits vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
==Lizenz==&lt;br /&gt;
&lt;br /&gt;
Als Student der Hochschule Augsburg erhalten Sie mit Ihrer Hochschul-E-Mail-Adresse eine kostenlose Studentenlizenz.&lt;br /&gt;
Füllen Sie dazu das Formular auf der Antragsseite aus: https://www.jetbrains.com/estore/students/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Falls Sie an einem Rechner der Hochschule arbeiten, können Sie die Hochschullizenz verwenden.&lt;br /&gt;
Bitte kontaktieren Sie den Lehrbeauftragten/Professor, um den Lizenzschlüssel zu erhalten.&lt;br /&gt;
&lt;br /&gt;
==IDE-Konfiguration==&lt;br /&gt;
&lt;br /&gt;
Webstorm ist auf die Entwicklung mit HTML/CSS/JavaScript ausgelegt, wodurch sich die Konfiguration sehr einfach gestaltet.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher dass unter &amp;lt;code&amp;gt;Webstorm&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Preferences&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;IDE Settings&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Plugins&amp;lt;/code&amp;gt;&lt;br /&gt;
auf jeden Fall folgende Plugins aktiviert sind (diese sollte standardmäßig der Fall sein):&lt;br /&gt;
&lt;br /&gt;
* JavaScript Support&lt;br /&gt;
* Subversion Integration&lt;br /&gt;
&lt;br /&gt;
Verifizieren Sie außerdem, dass unter &amp;lt;code&amp;gt;Project settings&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;JavaScript&amp;lt;/code&amp;gt; die &amp;lt;code&amp;gt;JavaScript language version&amp;lt;/code&amp;gt; auf&lt;br /&gt;
&amp;lt;code&amp;gt;ECMAScript 5.1&amp;lt;/code&amp;gt; eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
==Code-Style==&lt;br /&gt;
&lt;br /&gt;
Standardmäßig sind 4 Leerzeichen als Einrückung für Code-Formattierungen eingestellt.&lt;br /&gt;
Eine Vorgabe dafür gibt es nicht, die Empfehlung sind aber 2 Leerzeichen aufgrund der weiten Verbreitung.&lt;br /&gt;
&lt;br /&gt;
Um die Einstellung zu ändern klicken Sie jeweils auf &amp;lt;code&amp;gt;JavaScript&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CSS&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;HTML&amp;lt;/code&amp;gt; und&lt;br /&gt;
tragen bei &amp;lt;code&amp;gt;Tab size&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Indent&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Continuation Indent&amp;lt;/code&amp;gt; die gewünsche Zahl an Leerzeichen ein.&lt;br /&gt;
&lt;br /&gt;
Vermeiden Sie jedoch das Tab-Zeichen zu verwenden, da dies nicht genormt ist und je nach Betriebssystem anders interpretiert wird.&lt;br /&gt;
&lt;br /&gt;
==Markdown==&lt;br /&gt;
&lt;br /&gt;
Die Anmerkungen zu den Praktikumsaufgaben sind im Repository als Markdown-Dokumente abgespeichert.&lt;br /&gt;
Für Syntax Highlighting und eine Vorschauansicht müssen Sie das entsprechende Plugin installieren.&lt;br /&gt;
Dazu gehen Sie auf &amp;lt;code&amp;gt;Webstorm&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Preferences&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;IDE Settings&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Plugins&amp;lt;/code&amp;gt;,&lt;br /&gt;
suchen dort nach &amp;quot;Markdown support&amp;quot; und klicken anschließend auf &amp;lt;code&amp;gt;Browse&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dort erscheint dann ein Plugin namens &amp;quot;Markdown support&amp;quot;. Installieren Sie dieses und starten Webstorm danach neu.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Kapitel:Web-Programmierung]][[Kategorie:Web-Programmierung-HowTo]]&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_8&amp;diff=38246</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 8</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_8&amp;diff=38246"/>
		<updated>2015-10-01T21:14:13Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 8=  ==Model-View-Controller==  ===Ziel===  Ziel dieser Aufgabe ist es einen einarmigen Banditen nach dem [http://glossar.hs-augsburg.de/Mode…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 8=&lt;br /&gt;
&lt;br /&gt;
==Model-View-Controller==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es einen einarmigen Banditen nach dem&lt;br /&gt;
[http://glossar.hs-augsburg.de/Model-View-Controller-Paradigma Model-View-Controller-Paradigma] zu programmieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie einen neuen Ordner namens &amp;quot;aufgabe8&amp;quot; innerhalb Ihres Verzeichnis für die Praktikumsaufgaben.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Lehveranstaltungsordner &amp;quot;aufgabe8/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Die Vorlage enthält die Verzeichnisstruktur, die fertige HTML-Datei, die &amp;quot;EventDispatcher&amp;quot;&amp;quot;-Klasse und die fertige Hauptdatei.&lt;br /&gt;
Es gilt den gesamten Code für das Model, die View und den Controller zu entwickeln.&lt;br /&gt;
&lt;br /&gt;
Nutzen Sie die Code-Beispiele in den folgende Abschnitten um zu überprüfen ob Ihre Implementierungen korrekt sind.&lt;br /&gt;
Untersuchen Sie außerdem die Beispiele aus der Vorlesung unter &amp;quot;aufgabe8/beispiele&amp;quot; falls Sie nicht weiterkommen.&lt;br /&gt;
&lt;br /&gt;
===Model===&lt;br /&gt;
&lt;br /&gt;
Das Modell des einarmigen Banditen setzt sich aus den beiden Komponenten &amp;quot;Slot&amp;quot; und &amp;quot;SlotMachine&amp;quot; zusammen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Lassen Sie die Event-Kommunikation und die asynchrone Funktionsweise im ersten Schritt der Implementierung aus.&lt;br /&gt;
&lt;br /&gt;
====Slot====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Slot&amp;quot; repräsentiert ein Feld welches eine Menge an möglichen Werten vorhält und stets einen dieser Werte annimmt.&lt;br /&gt;
Die Menge an möglichen Werten wird bei der Erzeugung eines Felds als Argument an den Konstruktor übergeben.&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;quot;spin()&amp;quot; wird das Feld &#039;&#039;&#039;asynchron&#039;&#039;&#039; zufällig oft gedreht und nimmt immer wieder einen zufälligen Wert an.&lt;br /&gt;
Nutzen Sie einen JavaScript-Timer (z.B. &amp;lt;code&amp;gt;setTimeout&amp;lt;/code&amp;gt;) um das wiederholte asynchrone Drehen zu implementieren.&lt;br /&gt;
&lt;br /&gt;
Bei jeder Drehung des Felds wird das Ereignis &amp;quot;spin&amp;quot; erzeugt.&lt;br /&gt;
Wenn das Feld aufhört sich zu drehen wird das Ereignis &amp;quot;stop&amp;quot; erzeugt.&lt;br /&gt;
Als Daten für die beiden Ereignisse wird der jeweils aktuell angenommene Wert des Feldes mit übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
- Nutzen Sie die Hilfsklasse &amp;quot;EventDispatcher&amp;quot; aus der Vorlage für die Event-Kommunikation.&lt;br /&gt;
- Nutzen Sie &amp;lt;code&amp;gt;Math.random()&amp;lt;/code&amp;gt; um einen zufälligen Wert zu erzeugen oder zufällig eine Entscheidung zu treffen.&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte dann ein Feld erzeugen und zufällig häufig den neuen Wert ausgeben und abschließend einmal den finalen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var slot = new Slot([&#039;red&#039;, &#039;green&#039;, &#039;blue&#039;]);&lt;br /&gt;
slot.eventDispatcher.addEventListener(&#039;spin&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Neuer Wert: &#039; + event.detail);&lt;br /&gt;
});&lt;br /&gt;
slot.eventDispatcher.addEventListener(&#039;stop&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Finaler Wert: &#039; + event.detail);&lt;br /&gt;
});&lt;br /&gt;
slot.spin();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====SlotMachine====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;SlotMachine&amp;quot; repräsentiert eine Sammlung einer variablen Anzahl an Feldern und einer Menge an möglichen Werten für diese.&lt;br /&gt;
Die Anzahl der Felder und die Menge der möglichen Werte werden bei der Erzeugung als Argument an den Konstruktor übergeben.&lt;br /&gt;
Die &amp;quot;SlotMachine&amp;quot; erzeugt anhand der gegebenen Anzahl automatisch die einzelnen Felder und verwaltet diese intern.&lt;br /&gt;
Mithilfe der Funktion &amp;quot;spin()&amp;quot; wird die Funktion &amp;quot;spin()&amp;quot; von jedem in der Sammlung enthaltenen Feld augerufen.&lt;br /&gt;
Die &amp;quot;SlotMachine&amp;quot; hört auf jedes &amp;quot;spin&amp;quot;-Ereignis der Felder und erzeugt selbst daraufhin ein eigenes &amp;quot;spin&amp;quot;-Ereignis.&lt;br /&gt;
Haben alle enhtaltenen Felder das &amp;quot;stop&amp;quot;-Ereignis erzeugt, erzeugt die &amp;quot;SlotMachine&amp;quot; ebenso ein finales &amp;quot;stop&amp;quot;-Ereignis.&lt;br /&gt;
Die beiden Ereignisse übergeben als Daten jeweils alle aktuellen Werte der enthaltenen Felder als Liste.&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte drei Felder erzeugen und für jede Drehung jedes Felds und einmal abschließend alle Werte ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var slotMachine = new SlotMachine(3, [&#039;red&#039;, &#039;green&#039;, &#039;blue&#039;]);&lt;br /&gt;
slotMachine.eventDispatcher.addEventListener(&#039;spin&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Neue Werte: &#039; + event.detail);&lt;br /&gt;
});&lt;br /&gt;
slotMachine.eventDispatcher.addEventListener(&#039;stop&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Finale Werte: &#039; + event.detail);&lt;br /&gt;
});&lt;br /&gt;
slotMachine.spin();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===View===&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, dass Sie in den folgenden Abschnitten die SVG-API nutzen um die Views zu implementieren.&lt;br /&gt;
Möchten Sie DOM nutzen müssen Sie die &amp;quot;index.js&amp;quot; geringfügig ändern und die Views entsprechend anders benennen.&lt;br /&gt;
Analog zu dem Modell besteht die View des einarmigen Banditen aus den zwei Komponenten &amp;quot;SlotSVGView&amp;quot; und &amp;quot;SlotMachineSVGView&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====SlotSVGView====&lt;br /&gt;
&lt;br /&gt;
Eine &amp;quot;SlotSVGView&amp;quot; erzeugt für ein Feld ein rechteckige Repräsentation welche bei jedem neu angenommenen Wert die Farbe wechselt.&lt;br /&gt;
Das bedeutet, dass solch eine View die beiden Ereignisse &amp;quot;spin&amp;quot; und &amp;quot;stop&amp;quot; verarbeiten und entsprechend anzeigen muss.&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte für ein Feld ein Rectheck erzeugen welches beim Drehen des Felds zufällig oft seine Farbe wechselt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var slot = new Slot([&#039;red&#039;, &#039;green&#039;, &#039;blue&#039;]);&lt;br /&gt;
var slotView = new SlotSVGView(slot);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(slotView);&lt;br /&gt;
slot.spin();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Nutzen Sie Namen von Farben wie zum Beispiel &amp;quot;black&amp;quot; als mögliche Werte für Felder um das Rendering zu vereinfachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SlotMachineSVGView====&lt;br /&gt;
&lt;br /&gt;
Eine &amp;quot;SlotMachineSVGView&amp;quot; ist das View-Gegenstück zu einer &amp;quot;SlotMachine&amp;quot;, d.h. sie visualisiert eine Sammlung von Feldern.&lt;br /&gt;
Bei der Erzeugung einer solchen View wird für jedes darzustellende Feld eine eigene &amp;quot;SlotMachineSVGView&amp;quot; erzeugt.&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte für eine Sammlung von drei Feldern drei Rechtecke darstellen, welche Ihre Farbe wechseln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var slotMachine = new SlotMachine(3, [&#039;red&#039;, &#039;green&#039;, &#039;blue&#039;]);&lt;br /&gt;
var slotMachineView = new SlotMachineSVGView(slotMachine);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(slotView);&lt;br /&gt;
slotMachine.spin();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controller===&lt;br /&gt;
&lt;br /&gt;
Der Controller-Teil besteht aus der Komponente &amp;quot;SlotMachineController&amp;quot;, welche lediglich das Model kennen muss.&lt;br /&gt;
&lt;br /&gt;
Bei einem &amp;quot;click&amp;quot;-Ereignis auf dem Button mit der ID &amp;quot;spin-button&amp;quot; wird &amp;quot;spin()&amp;quot; auf der &amp;quot;SlotMachine&amp;quot; aufgerufen.&lt;br /&gt;
Mithilfe von &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt; wird dem Attribut &amp;quot;disabled&amp;quot; auf dem Button der Wert &amp;quot;disabled&amp;quot; zugewiesen.&lt;br /&gt;
Auf diese Weise wird der Button deaktiviert und kann nicht nochmal gedrückt werden, solange sich die Felder drehen.&lt;br /&gt;
Außerdem wird dem Attribut &amp;quot;innerHTML&amp;quot; auf dem Element mit der ID &amp;quot;result-text&amp;quot; der Text &amp;quot;Drehen...&amp;quot; zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Sobald die &amp;quot;SlotMachine&amp;quot; das &amp;quot;stop&amp;quot;-Ereignis erzeugt, überprüft der Controller ob der Spieler das Spiel gewonnen hat.&lt;br /&gt;
Sind alle Felder wertegleich wird dem &amp;quot;innerHTML&amp;quot; des Elements mit der ID &amp;quot;result-text&amp;quot; der Wert &amp;quot;Gewonnen!&amp;quot; zugewiesen.&lt;br /&gt;
Ist dies nicht der Fall wird der Wert &amp;quot;Verloren!&amp;quot; zugewiesen, um zu signalisieren, dass der Spieler verloren hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Spiel testen===&lt;br /&gt;
&lt;br /&gt;
Wurde alles korrekt implementiert, können Sie nun den einarmigen Banditen benutzen.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_7&amp;diff=38245</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 7</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_7&amp;diff=38245"/>
		<updated>2015-10-01T21:13:18Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 7=  ==Rendering und Animation==  ===Ziel===  Ziel dieser Aufgabe ist es ein einfaches Spiel mithilfe von Timern, DOM und SVG im Browser zu r…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 7=&lt;br /&gt;
&lt;br /&gt;
==Rendering und Animation==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es ein einfaches Spiel mithilfe von Timern, DOM und SVG im Browser zu rendern.&lt;br /&gt;
&lt;br /&gt;
Das Spiel besteht darin herunterfallenden Hindernissen auszuweichen. Der Spieler wird mit den Cursortasten gesteuert.&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie einen neuen Ordner &amp;quot;aufgabe7&amp;quot; innerhalb Ihres Verzeichnis für die Praktikumsaufgaben.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Vorlagenordner &amp;quot;aufgabe7/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Die Vorlage enthält ein voll funktionierendes Spiel, welches aus den folgenden Komponenten besteht:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;model/Player.js&#039;&#039;&#039; - Modell eines Spielers&lt;br /&gt;
* &#039;&#039;&#039;model/Enemy.js&#039;&#039;&#039; - Modell eines Gegners&lt;br /&gt;
* &#039;&#039;&#039;model/EnemyFactory.js&#039;&#039;&#039; - Erzeugt in regelmäßigen Abständen zufällige Gegner&lt;br /&gt;
* &#039;&#039;&#039;model/Level.js&#039;&#039;&#039; - Modell eines physikalischen Levels; bewegt die Spielobjekte und überprüft Kollisionen&lt;br /&gt;
* &#039;&#039;&#039;controller/GameController.js&#039;&#039;&#039; - Verarbeitet Benutzereingaben und gibt Änderungen der Modelle an die Views weiter&lt;br /&gt;
* &#039;&#039;&#039;index.js&#039;&#039;&#039; - Startet das Spiel, erzeugt und orchestriert die einzelnen Komponenten&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;quot;index.js&amp;quot; wartet zunächst auf Eingaben durch den Benutzer um daraufhin das Spiel zu starten.&lt;br /&gt;
Dabei wird im ersten Schritt eine physikalische Welt erzeugt und ein Spieler dieser hinzugefügt.&lt;br /&gt;
Des Weiteren wird eine EnemyFactory erstellt, welche Gegner erzeugt, die auch der physikalischen Welt hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Damit die Spielobjekte im Browser gerendert werden können wird außerdem ein View-Objekt erzeugt.&lt;br /&gt;
Ebenso wie der physikalischen Welt werden die Spieler- und Gegner-Objekte auch der View hinzugefügt.&lt;br /&gt;
Welche View-Technologie verwendet wird um das Spiel darzustellen kann der Benutzer vor dem Spielstart entscheiden.&lt;br /&gt;
&lt;br /&gt;
===Funktionsweise von Views===&lt;br /&gt;
&lt;br /&gt;
Unabhängig davon welche Technologie zum Rendern verwendet wird, folgen die Views immer der gleichen Logik und Struktur.&lt;br /&gt;
Es gibt eine Konstruktorfunktion (&amp;lt;code&amp;gt;DOMView&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;SVGView&amp;lt;/code&amp;gt;) welche ein View-Objekt erzeugt.&lt;br /&gt;
Diese Konstruktorfunktion erwartet ein DOM-Element, in dem die Ansicht eingebaut werden soll, und eine Höhe und Breite.&lt;br /&gt;
&lt;br /&gt;
Sobald ein View-Objekt erzeugt wird, soll es sich automatisch um das regelmäßige Rendern der Spiels kümmern.&lt;br /&gt;
Dazu muss ein solches Objekt die zwei Funktionen &amp;lt;code&amp;gt;addObjectView()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;destroy()&amp;lt;/code&amp;gt; implementieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;addObjectView(object, color)&amp;lt;/code&amp;gt; erzeugt für ein gegebenes Objekt (z.B. Spieler) eine entsprechende View-Repräsentation.&lt;br /&gt;
Das Objekt wird als &#039;&#039;&#039;Rechteck&#039;&#039;&#039; an seiner x- und y-Position mit seiner Breite und Höhe und der gegegebenen Farbe dargestellt.&lt;br /&gt;
Verändert sich die Position des Objekts im Laufe des Spiels, so muss die View dies in regelmäßigen Abständen abbilden.&lt;br /&gt;
&lt;br /&gt;
Nutzen Sie einen geeigneten Timer, wie zum Beispiel &amp;lt;code&amp;gt;requestAnimationFrame()&amp;lt;/code&amp;gt;, um den Render-Vorgang wiederholt auszuführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var renderRepeatedly = function() {&lt;br /&gt;
  console.log(&#039;rendering&#039;);&lt;br /&gt;
  window.requestAnimationFrame(renderRepeatedly);&lt;br /&gt;
}&lt;br /&gt;
renderRepeatedly();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um beim Render-Durchgang festzustellen welches View-Objekt welche Positions- und Formänderungen abbilden muss,&lt;br /&gt;
muss die Verknüpfung von dem zu rendernden Objekt und dem View-Objekt in einer Liste gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Beispielhafte Implementierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var childViews = [];&lt;br /&gt;
this.addObjectView = function(object, color) {&lt;br /&gt;
  var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
  // ... style and add div element&lt;br /&gt;
  childViews.push({&lt;br /&gt;
    object: object,&lt;br /&gt;
    div: div&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;destroy()&amp;lt;/code&amp;gt; muss dafür Sorge tragen, dass eine View korrekt entfernt wird, inklusive aller verwendeten Timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Views implementieren===&lt;br /&gt;
&lt;br /&gt;
Im Folgenden gilt es die zwei unterschiedlichen Views zu implementieren, die das Spiel dann darstellen sollen.&lt;br /&gt;
Für jede View-Technologie ist im Vorlagen-Ordner bereits eine Datei angelegt mit einer minimalen Code-Vorgabe.&lt;br /&gt;
&lt;br /&gt;
====DOM-View====&lt;br /&gt;
&lt;br /&gt;
Implementieren Sie im ersten Schritt eine DOM-View, welche das Spiel mithilfe von DOM-Elementen darstellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Rechtecke können Sie einfach mit absolut positionierten &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;-Elementen darstellen.&lt;br /&gt;
&lt;br /&gt;
Beispielcode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var viewElement = document.createElement(&#039;div&#039;);&lt;br /&gt;
viewElement.style.position = &#039;absolute&#039;;&lt;br /&gt;
viewElement.style.backgroundColor = &#039;green&#039;;&lt;br /&gt;
viewElement.style.width = &#039;40px&#039;;&lt;br /&gt;
viewElement.style.height = &#039;40px&#039;;&lt;br /&gt;
viewElement.style.left = &#039;5px&#039;;&lt;br /&gt;
viewElement.style.top = &#039;5px&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====SVG-View====&lt;br /&gt;
&lt;br /&gt;
Implementieren Sie anschließend eine SVG-View, welche das Spiel mithilfe von SVG-Elementen darstellt.&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn Sie SVG-Elemente mit der DOM-API erzeugen wollen müssen die Funktion &amp;lt;code&amp;gt;createElementNS()&amp;lt;/code&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var svg = document.createElementNS(&#039;http://www.w3.org/2000/svg&#039;, &#039;svg&#039;);&lt;br /&gt;
svg.setAttribute(&#039;version&#039;, &#039;1.1&#039;);&lt;br /&gt;
svg.setAttribute(&#039;width&#039;, &#039;500&#039;);&lt;br /&gt;
svg.setAttribute(&#039;height&#039;, &#039;500&#039;);&lt;br /&gt;
svg.setAttribute(&#039;x&#039;, &#039;10&#039;);&lt;br /&gt;
svg.setAttribute(&#039;y&#039;, &#039;10&#039;);&lt;br /&gt;
&lt;br /&gt;
var rect = document.createElementNS(&#039;http://www.w3.org/2000/svg&#039;, &#039;svg&#039;);&lt;br /&gt;
svg.appendChild(rect);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Optional: Darstellung anpassen===&lt;br /&gt;
&lt;br /&gt;
Ändern Sie die Views so ab, dass Spieler und Gegner nicht mehr als Rechtecke sondern als Bilder dargestellt werden.&lt;br /&gt;
Der Spieler kann zum Beispiel als Raumschiff und die Gegner als entgegenkommende Meteoriten dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Falls Sie Bilder aus dem Internet nutzen möchten achten Sie biite auf die entsprechenden Bildrechte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
&lt;br /&gt;
Nutzen Sie die folgenden Links für weitere Information über Timer, SVG und Canvas:&lt;br /&gt;
&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setInterval&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/API/window.requestAnimationFrame&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_6&amp;diff=38244</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 6</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_6&amp;diff=38244"/>
		<updated>2015-10-01T21:12:49Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 6=  ==Ereignisverarbeitung==  ===Ziel===  Ziel dieser Aufgabe ist es die in dem Browser-Tutorium vermittelten Grundlagen für Ereignisverarb…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 6=&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es die in dem Browser-Tutorium vermittelten Grundlagen für Ereignisverarbeitung zu vertiefen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie einen neuen Ordner &amp;quot;aufgabe6&amp;quot; innerhalb Ihres Verzeichnis/Repositories.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Vorlagenordner &amp;quot;aufgabe6/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Fügen Sie sämtlichen Code für die folgenden Teilaufgaben in die Datei &amp;quot;index.js&amp;quot; ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Spiel starten===&lt;br /&gt;
&lt;br /&gt;
Registrieren Sie auf dem HTML-Input-Element mit der ID &amp;quot;start-game&amp;quot; einen Event-Listener für das &amp;quot;click&amp;quot;-Ereignis.&lt;br /&gt;
Wird der Button geklickt sollen folgendes geschehen:&lt;br /&gt;
&lt;br /&gt;
* Der Button selbst wird aus dem DOM entfernt mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Es wird eine Funktion namens &amp;lt;code&amp;gt;startGame()&amp;lt;/code&amp;gt; aufgerufen; erzeugen Sie dazu diese zunächst leere Funktion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Punktestandsanzeige erzeugen===&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine globale Variable &amp;quot;score&amp;quot; und initialisieren Sie diese mit dem Wert 0.&lt;br /&gt;
Erweiteren Sie dann die nach wie vor leere Funktion &amp;lt;code&amp;gt;startGame()&amp;lt;/code&amp;gt; um die folgende Logik:&lt;br /&gt;
&lt;br /&gt;
* Der globalen Variable &amp;quot;score&amp;quot; wird der Wert 0 zugewiesen&lt;br /&gt;
* Es wird ein DOM-Element mit Tag-Namen &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt; erzeugt&lt;br /&gt;
* Diesem Element wird das Attribut &amp;quot;id&amp;quot; mit Wert &amp;quot;score&amp;quot; zugewiesen&lt;br /&gt;
* Abschließend wird das DOM-Element dem &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Element hinzugefügt mit &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zielobjekt erzeugen===&lt;br /&gt;
&lt;br /&gt;
Nach der Erzeugung des Punktestands soll die Funktion &amp;lt;code&amp;gt;startGame()&amp;lt;/code&amp;gt; eine neue Funktion &amp;lt;code&amp;gt;createGameObject()&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
Erzeugen Sie die Funktion &amp;lt;code&amp;gt;createGameObject()&amp;lt;/code&amp;gt; und implementieren Sie folgende Logik:&lt;br /&gt;
&lt;br /&gt;
* Es wird ein DOM-Element mit Tag-Namen &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt; erzeugt&lt;br /&gt;
* Diesem Element wird das Attribut &amp;quot;class&amp;quot; mit dem Wert &amp;quot;goal&amp;quot; zugewiesen&lt;br /&gt;
* Außerdem wird dem Element mittels CSS eine zufällige x- und y-Position zugewiesen&lt;br /&gt;
* Abschließend wird das DOM-Element dem &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Element hinzugefügt mit &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Nutzen Sie folgenden Code um einem Element per CSS eine zufällige x- und y-Position zuzuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
element.style.left = Math.floor(Math.random() * 300) + &#039;px&#039;&lt;br /&gt;
element.style.top = 30 + Math.floor(Math.random() * 300) + &#039;px&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn Sie nun die Seite laden und den Button drücken um das Spiel zu starten, sollte ein grünes Rechteck gerendert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zielobjekt abschiessen===&lt;br /&gt;
&lt;br /&gt;
Fügen Sie nun einen Event-Listener für das &amp;quot;click&amp;quot;-Ereignis auf dem Dokument hinzu, der überprüfen soll ob das Ziel geklickt wurde.&lt;br /&gt;
Dies stellen Sie fest, indem Sie das &amp;quot;class&amp;quot;-Attribut des ursprünglichen Ereignis-Ziels (&amp;lt;code&amp;gt;event.target&amp;lt;/code&amp;gt;) auf den Wert &amp;quot;goal&amp;quot; testen.&lt;br /&gt;
Ist das der Fall soll das Zielelement aus dem Dokument entfernt werden und &amp;lt;code&amp;gt;createGameObject()&amp;lt;/code&amp;gt; erneut aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie nun auf das grüne Rechteck klicken sollte dies verschwinden und an einer anderen Stelle ein neues erscheinen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Punktestand aktualisieren===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie anschließend eine Funktion namens &amp;lt;code&amp;gt;renderScore()&amp;lt;/code&amp;gt;, welche den aktualisierten Punktestand darstellen soll.&lt;br /&gt;
Implementieren Sie dazu folgende Logik:&lt;br /&gt;
&lt;br /&gt;
* Es wird nach dem DOM-Element mit der ID &amp;quot;score&amp;quot; gesucht (z.B. mittels &amp;lt;code&amp;gt;querySelector()&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Der Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; des Elements wird die Kombination aus &amp;quot;Punkte: &amp;quot; und dem Wert von der Variable &amp;quot;score&amp;quot; zugewiesen&lt;br /&gt;
&lt;br /&gt;
Fügen Sie außerdem einen Aufruf der Funktion an den folgenden Stellen hinzu:&lt;br /&gt;
&lt;br /&gt;
* An der Stelle in der &amp;lt;code&amp;gt;startGame()&amp;lt;/code&amp;gt;-Funktion nachdem die Punktestandsanzeige erzeugt wurde&lt;br /&gt;
* An der Stelle an der beim Klick auf ein Zielelement ein neues erzeugt wird&lt;br /&gt;
&lt;br /&gt;
An der zweiten Stelle soll die globale Variable &amp;quot;score&amp;quot; um eins hochgezählt werden.&lt;br /&gt;
Wenn Sie nun auf ein grünes Rechteck klicken sollte sich der Punktestand um eins erhöhen und angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hindernisse erzeugen===&lt;br /&gt;
&lt;br /&gt;
Um Hindernisse zu erzeugen ändern Sie nun die Funktion &amp;lt;code&amp;gt;createGameObject()&amp;lt;/code&amp;gt; wie folgt ab:&lt;br /&gt;
* Es wird ein einzelnes Argument namens &amp;quot;type&amp;quot; akzpetiert&lt;br /&gt;
* Dieses Argument wird verwendet um zu bestimmen welches Klassenattribut dem neuen Element zugewiesen wird&lt;br /&gt;
&lt;br /&gt;
Ändern Sie die beiden Stellen an denen &amp;lt;code&amp;gt;createGameObject()&amp;lt;/code&amp;gt; aufgerufen wird so, dass es nun &amp;lt;code&amp;gt;createGameObject(&amp;quot;goal&amp;quot;)&amp;lt;/code&amp;gt; heisst.&lt;br /&gt;
Fügen Sie außerdem an der Stelle wo der Punktestand um eins erhöht wird den Aufruf &amp;lt;code&amp;gt;createGameObject(&amp;quot;obstacle&amp;quot;)&amp;lt;/code&amp;gt; hinzu.&lt;br /&gt;
&lt;br /&gt;
Nun sollte mit jedem Klick auf das Ziel ein weiteres Hindernis entstehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Spiel beenden===&lt;br /&gt;
&lt;br /&gt;
Fügen Sie dann einen Event-Listener für das &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt;-Ereignis hinzu, welches überprüfen soll ob Hindernisse berührt werden.&lt;br /&gt;
Dies können Sie feststellen indem Sie testen, ob das ursprüngliche Ereignis-Ziel (&amp;lt;code&amp;gt;event.target&amp;lt;/code&amp;gt;) die Klasse &amp;quot;obstacle&amp;quot; hat.&lt;br /&gt;
In diesem Fall soll der &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt;-Eigenschaft des &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Elements&lt;br /&gt;
die Kombination aus dem String &amp;quot;Game over. Erreichte Punkte: &amp;quot; und dem Wert der Variable &amp;quot;score&amp;quot; zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
Nun sollte das Spiel vorbei sein sobald Sie ein Hindernis berühren und der finale Punktestand angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Spiel neustarten===&lt;br /&gt;
&lt;br /&gt;
Registrieren Sie einen Event-Listener für das &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt;-Ereignis auf dem Dokument um das Spiel mit Leertaste neustarten zu können.&lt;br /&gt;
Es soll überprüft werden ob &amp;lt;code&amp;gt;event.keyCode&amp;lt;/code&amp;gt; den Wert 32 hat und in diesem Fall soll die Funktion &amp;lt;code&amp;gt;startGame()&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie dann die Funktion &amp;lt;code&amp;gt;startGame()&amp;lt;/code&amp;gt; um folgende Logik damit das Spielfeld vor einem Neustart aufgeräumt wird:&lt;br /&gt;
&lt;br /&gt;
* Der Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; des &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Elements wird ein leerer String zugewiesen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Optional: Spiel verbessern===&lt;br /&gt;
&lt;br /&gt;
Momentan ist es möglich, dass ein Hindernis direkt an der Stelle des Mauszeigers erscheint und das Spiel beendet ist.&lt;br /&gt;
Erweitern Sie die aktuelle Implementierung so, dass ausgeschlossen ist, dass dies passieren kann.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_5&amp;diff=38243</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 5</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_5&amp;diff=38243"/>
		<updated>2015-10-01T21:11:52Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 5=  ==Dokumentenzugriff==  ===Ziel===  Ziel dieser Aufgabe ist es die in dem Browser-Tutorium vermittelten Grundlagen für das Arbeiten mit…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 5=&lt;br /&gt;
&lt;br /&gt;
==Dokumentenzugriff==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es die in dem Browser-Tutorium vermittelten Grundlagen für das Arbeiten mit Dokumenten zu vertiefen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist fortan nicht notwendig Subversion über die Kommandozeile zu bedienen.&lt;br /&gt;
Nutzen Sie dazu einfach WebStorm oder aber TortoiseSVN bzw. svnX.&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie einen neuen Ordner &amp;quot;aufgabe5&amp;quot; innerhalb Ihres Verzeichnis/Repositories.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Vorlagenordner &amp;quot;aufgabe5/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Machen Sie sich mit der Datei &amp;quot;index.html&amp;quot; vertraut und öffnen Sie diese testweise im Browser.&lt;br /&gt;
Speichern Sie alle Bestandteile des zu erstellenden Loggers in der Datei &amp;quot;logger.js&amp;quot; ab.&lt;br /&gt;
Die eigentliche Ausführung des Programms und die Testausgaben speichern Sie in der Datei &amp;quot;index.js&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Logger erzeugen===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie zunächst einen global verfügbaren Konstruktor namens &amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; welcher mithilfe von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden kann.&lt;br /&gt;
Dieser Konstruktor soll ein Objekt zurückliefern welches eine Funktion namens &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion nimmt einen Parameter &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; entgegen und ruft damit die Funktion &amp;lt;code&amp;gt;console.log()&amp;lt;/code&amp;gt; auf.&lt;br /&gt;
Das bedeutet dass ein Logger-Objekt zuerst nichts anderes macht als die Nachricht an die &#039;&#039;&#039;Browser-Konsole&#039;&#039;&#039; weiterzureichen.&lt;br /&gt;
Fügen Sie dann folgenden Aufruf in die Datei &amp;quot;index.js&amp;quot; ein und betrachten Sie die &amp;quot;index.html&amp;quot; im Browser.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var logger = new Logger();&lt;br /&gt;
logger.log(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konsole sollte dementsprechend nach Ausführung dieses Codes die Nachricht &amp;quot;Hello World&amp;quot; anzeigen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Nachrichten ins Dokument einfügen===&lt;br /&gt;
&lt;br /&gt;
Ändern Sie nun die Funktion &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; der Logger-Objekte so ab, dass sie fortan folgendes Verhalten aufweist:&lt;br /&gt;
&lt;br /&gt;
* Es wird ein Element-Objekt mit dem Tag-Namen &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt; erzeugt&lt;br /&gt;
* Das Argument &amp;quot;message&amp;quot; wird der Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; des erzeugten Elements zugewiesen&lt;br /&gt;
* Weisen Sie dem erzeugten Objekt als &amp;quot;class&amp;quot;-Attibut den Wert &amp;quot;message&amp;quot; zu mithilfe von &amp;lt;code&amp;gt;setAttribute(key, value)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Das Element-Objekt mit der Klasse &amp;quot;messages&amp;quot; wird im Dokument gesucht mittels &amp;lt;code&amp;gt;querySelector()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Dem zuvor gesuchten Objekt wird das neu erzeugte &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;-Objekt angehängt mittels &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgende Anweisung soll nun dazu führen, dass eine Nachricht als sichtbares Element im Dokument eingefügt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var logger = new Logger();&lt;br /&gt;
logger.log(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Präfix für Nachrichten===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie den Logger-Konstruktor nun so, dass dieser ein Konstruktorargument namens &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt; entgegennimmt.&lt;br /&gt;
Anschließend soll dem erstellten Logger-Objekt der Präfix als Eigenschaft zugewiesen werden.&lt;br /&gt;
Schreiben Sie &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; so um, dass &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt; mit der Nachricht kombiniert wird und das Ergebnis als Nachricht ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var logger = new Logger(&#039;message: &#039;);&lt;br /&gt;
logger.log(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben stehende Code sollte dementsprechend dazu führen dass in der Konsole &amp;quot;message: Hello World&amp;quot; ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Weitere Nachrichten ausgeben===&lt;br /&gt;
&lt;br /&gt;
Schreiben Sie abschließend die Datei &amp;quot;index.js&amp;quot; so um, dass sie folgendes Verhalten aufweist:&lt;br /&gt;
&lt;br /&gt;
* Zuerst wird der Name des Benutzers abgefragt mithilfe von &amp;lt;code&amp;gt;window.prompt()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Dann wird der Benutzer begrüßt durch eine Logger-Nachricht (&amp;lt;code&amp;gt;&amp;quot;Hallo &amp;quot; + name&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Des Weiteren wird die aktuelle URL durch den Logger ausgegeben (&amp;lt;code&amp;gt;location.href&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Zuletzt soll noch der verwendete Browser angezeigt werden (&amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Verschiedene Typen===&lt;br /&gt;
&lt;br /&gt;
Ändern Sie nun die durch den Konstruktor erstellten Logger-Objekte so ab, das diese die folgenden drei Funktionen enthalten:&lt;br /&gt;
&amp;lt;code&amp;gt;logMessage()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;logWarning()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;logError()&amp;lt;/code&amp;gt;. Benennen Sie im ersten Schritt die Funktion &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;logMessage()&amp;lt;/code&amp;gt; um.&lt;br /&gt;
Die anderen beiden Funktionen &amp;lt;code&amp;gt;logWarning()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;logError()&amp;lt;/code&amp;gt; sollen ähnlich funktionieren mit dem Unterschied&lt;br /&gt;
dass &amp;lt;code&amp;gt;logWarning()&amp;lt;/code&amp;gt; dem erstellen Element-Objekt die HTML-Klasse &amp;quot;warning&amp;quot; zuweisen soll und &amp;lt;code&amp;gt;logError()&amp;lt;/code&amp;gt; die Klasse &amp;quot;error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der folgende Code soll dazu führen dass eine normale Nachricht, sowie eine orange und eine rote Nachricht ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var logger = new Logger(&#039;message: &#039;);&lt;br /&gt;
logger.logMessage(&#039;normal message&#039;);&lt;br /&gt;
logger.logWarning(&#039;something is not okay&#039;);&lt;br /&gt;
logger.logError(&#039;something went completely wrong&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_4&amp;diff=38242</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 4</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_4&amp;diff=38242"/>
		<updated>2015-10-01T21:11:16Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 4=  ==Arbeiten mit Funktionen und &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;==  ===Ziel===  Ziel dieser Aufgabe ist es die in dem JavaScript-Tutorium vermittelten Gr…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 4=&lt;br /&gt;
&lt;br /&gt;
==Arbeiten mit Funktionen und &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es die in dem JavaScript-Tutorium vermittelten Grundlagen für&lt;br /&gt;
Funktionen, Konstruktoren und &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zu vertiefen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist fortan nicht notwendig Subversion über die Kommandozeile zu bedienen.&lt;br /&gt;
Nutzen Sie dazu einfach WebStorm oder aber TortoiseSVN bzw. svnX.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher, dass Sie die Praktikumsvorlagen auf Ihrem Rechner gespeichert haben.&lt;br /&gt;
Folgen Sie dazu der Anleitung aus Teil 1 der 1. Praktikumsaufgabe.&lt;br /&gt;
&lt;br /&gt;
Legen Sie dann einen neuen Ordner &amp;quot;aufgabe4&amp;quot; innerhalb Ihres Verzeichnis/Repositories an.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Lehrveranstaltungsordner &amp;quot;aufgabe4/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Machen Sie sich mit der Datei &amp;quot;index.js&amp;quot; vertraut und öffnen Sie die Datei &amp;quot;index.html&amp;quot; testweise im Browser.&lt;br /&gt;
Fügen Sie den Code relevant für Spieler der nachfolgenden Teilaufgaben in die Datei &amp;quot;Spieler.js&amp;quot; ein.&lt;br /&gt;
&lt;br /&gt;
Den Test-Code in den folgenden Abschnitten können Sie in die Datei &amp;quot;index.js&amp;quot; einpflegen um Ihre Lösungen zu validieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Spieler erstellen===&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie zunächst eine Funktion namens &amp;lt;code&amp;gt;createPlayer()&amp;lt;/code&amp;gt; die bei jedem Aufruf ein leeres Objekt erzeugt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = createPlayer();&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
&lt;br /&gt;
var player2 = createPlayer();&lt;br /&gt;
view.addObjectView(player2);&lt;br /&gt;
&lt;br /&gt;
console.log(player1 !== player2); // sollte true ergeben&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erweiteren Sie die Funktion nun so, dass sie zwei Argumente namens &amp;quot;name&amp;quot; und &amp;quot;numberOfLifes&amp;quot; akzeptiert&lt;br /&gt;
und die Werte dieser Argumente gleichnamigen Eigenschaften dem erzeugten Objekt zuweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = createPlayer(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Konstruktor für Spieler===&lt;br /&gt;
&lt;br /&gt;
Wandeln Sie die Funktion &amp;lt;code&amp;gt;createPlayer()&amp;lt;/code&amp;gt; nun in eine Konstruktorfunktion namens &amp;lt;code&amp;gt;Player()&amp;lt;/code&amp;gt; um.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player();&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Konstruktor soll nach wie vor &amp;quot;name&amp;quot; und &amp;quot;numberOfLifes&amp;quot; akzeptieren und die Werte dem neu erstellten Objekt zuweisen.&lt;br /&gt;
Die zugewiesenen Eigenschaften sollen nun allerdings mit einem Unterstrich beginnen, um sie als privat zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher, dass der Konstruktor nur mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden kann. Folgender Code sollte einen Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = Player(&#039;John&#039;, 3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leben verlieren===&lt;br /&gt;
&lt;br /&gt;
Im Laufe eines Spiels kann es passieren, dass ein Spieler ein oder mehrere seiner Leben verliert.&lt;br /&gt;
Erstellen Sie dazu auf jedem neuen Spielerobjekt die Funktion &amp;lt;code&amp;gt;loseLife()&amp;lt;/code&amp;gt;, welche die Zahl der Leben um eins reduziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
player1.loseLife(); // sollte nun 2 betragen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Namen abändern===&lt;br /&gt;
&lt;br /&gt;
Außerdem kann es sein, dass sich ein Spieler nachträglich für einen anderen Namen entscheiden möchte.&lt;br /&gt;
FÜgen Sie deshalb auf jedem neuen Spielerobjekt die Funktion &amp;lt;code&amp;gt;changeName(name)&amp;lt;/code&amp;gt; hinzu, welche den Namen des Spielers ändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
player1.changeName(&#039;James&#039;); // Name sollte nun James sein&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aktuelle Spielerinformationen===&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie jedes neue Spielerobjekt um die Funktion &amp;lt;code&amp;gt;getInfo()&amp;lt;/code&amp;gt;, welche aktuelle Spielerinformationen bereitstellen soll.&lt;br /&gt;
Die Funktion liefert den Namen des Spielers und die Anzahl seiner aktuellen Leben als zusammengesetzten String zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
player1.loseLife();&lt;br /&gt;
player1.changeName(&#039;James&#039;);&lt;br /&gt;
console.log(player1.getInfo()); // gibt &#039;Spieler: James / Leben: 2&#039; aus&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Typüberprüfung===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In bestimmten Spielsituationen kann es wichtig sein zu überprüfen, ob sich bei einem Objekt um einen Spieler handelt.&lt;br /&gt;
Schreiben Sie die dazu die Funktion &amp;lt;code&amp;gt;Player.isPlayer()&amp;lt;/code&amp;gt;, welche den Typ von einem gegebenen Objekt überprüft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var player1 = new Player(&#039;John&#039;, 3);&lt;br /&gt;
view.addObjectView(player1);&lt;br /&gt;
console.log(Player.isPlayer(player1)); // true&lt;br /&gt;
console.log(Player.isPlayer({})); // false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_3&amp;diff=38241</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 3</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_3&amp;diff=38241"/>
		<updated>2015-10-01T21:10:08Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 3=  ==Arbeiten mit Objekten und Arrays==  ===Ziel===  Ziel dieser Aufgabe ist es die in dem JavaScript-Tutorium vermittelten Grundlagen für…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 3=&lt;br /&gt;
&lt;br /&gt;
==Arbeiten mit Objekten und Arrays==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es die in dem JavaScript-Tutorium vermittelten Grundlagen für Objekte und Arrays zu vertiefen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist fortan nicht notwendig Subversion über die Kommandozeile zu bedienen.&lt;br /&gt;
Nutzen Sie dazu einfach WebStorm oder aber TortoiseSVN bzw. svnX.&lt;br /&gt;
&lt;br /&gt;
Legen Sie einen neuen Ordner &amp;quot;aufgabe3&amp;quot; innerhalb Ihres Verzeichnis/Repositories an.&lt;br /&gt;
Speichern Sie alle Dateien aus dem Lehrveranstaltungsordner &amp;quot;aufgabe3/vorlage&amp;quot; in diesem Ordner ab.&lt;br /&gt;
&lt;br /&gt;
Machen Sie sich mit der Datei &amp;quot;index.js&amp;quot; vertraut und öffnen Sie die Datei &amp;quot;index.html&amp;quot; testweise im Browser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Charaktere darstellen===&lt;br /&gt;
&lt;br /&gt;
Der Code aus der Vorlage enthält ein übergeordnetes View-Objekt, welches beliebig viele Objekt-Views beherbergen kann.&lt;br /&gt;
Eine Objekt-View rendert alle Eigenschaften eines Objekts mitsamt der Werte und Datentypen in das HTML-Dokument.&lt;br /&gt;
Mithilfe eines Aufrufs von &amp;lt;code&amp;gt;view.addObjectView()&amp;lt;/code&amp;gt; wird für eine beliebiges Objekt eine Objekt-View erzeugt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Charaktere erzeugen===&lt;br /&gt;
&lt;br /&gt;
Bearbeiten Sie nun die &amp;quot;index.js&amp;quot; und erzeugen Sie folgende Personen mit Ihrer Ansicht nach &#039;&#039;&#039;geeigneten Eigenschaften&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* Bruce Wayne, 40 Jahre alt, vermögend, kleidet sich gerne schwarz, wohnt in Gotham City&lt;br /&gt;
* Clark Kent, 30 Jahre alt, arbeitet als Redakteur, trägt Brille, wohnt in Metropolis&lt;br /&gt;
* Peter Parker, 25 Jahre alt, ist Fotograf, trägt Brille&lt;br /&gt;
&lt;br /&gt;
Fügen Sie diese anschließend zu der View hinzu um eine entsprechende Darstellung der Objekte zu erreichen.&lt;br /&gt;
Welche Eigenschaften und Datentypen haben Sie für die Personen gewählt? Gibt es sinnvolle Alternativen?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Charaktere modifizieren===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Folgenden geht es darum, die zuvor erstellten Objekte nach Ihrer Erzeugung zu modifizieren.&lt;br /&gt;
Es geht nicht darum Funktionen zu erstellen oder Bedingungen abzufragen.&lt;br /&gt;
&lt;br /&gt;
Die oben erwähnten Charaktere verfügen alle über ein bestimmtes Alter, welches sich über die Zeit verändern soll.&lt;br /&gt;
Lassen Sie alle Charaktere nach der initialen Erstellung der Objekte um 5 Jahre altern.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren sollte jeder Charakter eine entsprechende Eigenschaft &amp;quot;anrede&amp;quot; besitzen (mögliche Werte: &amp;quot;Herr&amp;quot; und &amp;quot;Frau&amp;quot;).&lt;br /&gt;
Fügen Sie die korrekte Anrede den Charakterobjekten nach ihrer initialen Erstellung hinzu.&lt;br /&gt;
&lt;br /&gt;
Peter Parker bekommt im Laufe seines Lebens Superkräfte, welche unter anderem dazu führen, dass er keine Brille mehr braucht.&lt;br /&gt;
Ändern Sie das entsprechende Objekt nachträglich so ab, dass klar ersichtlich ist, dass Peter keine Sehschwäche mehr hat.&lt;br /&gt;
Gibt es hierfür mehrere Lösungswege? Wenn ja, welcher Unterschied besteht zwischen den Lösungen?&lt;br /&gt;
&lt;br /&gt;
Clark Kent, auch bekannt als Superman, bestizt viele verschiedene Superkräfte, wie z.B. Fliegen, Laseraugen, Röntgenblick.&lt;br /&gt;
Um den Überblick zu behalten fügen Sie die Eigenschaft &amp;quot;superKräfte&amp;quot; hinzu und speichern Sie die o.g. genannten Werte ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Charaktere zusammenfassen===&lt;br /&gt;
&lt;br /&gt;
Um leichter mit den Charakterobjekten arbeiten zu können bietet es sich an diese in einem Array abzuspeichern.&lt;br /&gt;
Erzeugen Sie ein Array-Objekt names &amp;quot;superhelden&amp;quot; und fügen Sie die zuvor erstellten Personen hinzu.&lt;br /&gt;
Gibt es hierfür unterschiedliche Implementierungsmöglichkeiten?&lt;br /&gt;
&lt;br /&gt;
Für bestimmte Szenarien ist es hilfreich die Initialen von Charakteren zu wissen.&lt;br /&gt;
Da die Charaktere nun in einem Array sind, iterieren Sie über das Array und weisen Sie jedem Charakter Ihre Initialen zu.&lt;br /&gt;
Wenden Sie dazu die String-Funktion &amp;lt;code&amp;gt;charAt()&amp;lt;/code&amp;gt; mit einem Parameter von 0 auf dem jeweiligen Vor- und Nachnamen an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Superheldenliste modifizieren===&lt;br /&gt;
&lt;br /&gt;
Unter gewissen Umständen würde man Bruce Wayne nicht als Superhelden bezeichnen, da er über keine Superkräfte verfügt.&lt;br /&gt;
Entfernen Sie ihn aus diesem Grund aus der Liste von Superhelden nachdem Sie die Anrede hinzugefügt haben.&lt;br /&gt;
Stellen Sie sicher, dass das Array im Anschluss keine Lücken aufweist und eine Länge von 2 besitzt.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_2&amp;diff=38240</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 2</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_2&amp;diff=38240"/>
		<updated>2015-10-01T21:09:28Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 2=  ==Vertiefung der JavaScript-Grundlagen==  ===Ziel===  Ziel dieser Aufgabe ist es eine bestehende JavaScript-Logger-Anwendung zu erweiter…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 2=&lt;br /&gt;
&lt;br /&gt;
==Vertiefung der JavaScript-Grundlagen==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist es eine bestehende JavaScript-Logger-Anwendung zu erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt vorbereiten===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist fortan nicht notwendig Subversion über die Kommandozeile zu bedienen.&lt;br /&gt;
Nutzen Sie dazu einfach WebStorm oder alternativ TortoiseSVN bzw. svnX.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher, dass Sie die Praktikumsvorlagen auf Ihrem Rechner gespeichert haben.&lt;br /&gt;
Folgen Sie dazu der Anleitung aus Teil 1 der 1. Praktikumsaufgabe.&lt;br /&gt;
&lt;br /&gt;
Legen Sie ein neues Verzeichnis &amp;quot;aufgabe2&amp;quot; innerhalb Ihres Repository-Verzeichnisses an.&lt;br /&gt;
Kopieren Sie die aus dem Lehrveranstaltung-Repository im Ordner &amp;quot;aufgabe2/vorlage&amp;quot; enthaltenen Dateien in das Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Log-Funktion verwenden===&lt;br /&gt;
&lt;br /&gt;
Wie im zweiten Teil der ersten Aufgabe wird bei dieser Aufgabe eine Logger-Funktion zur Verfügung gestellt.&lt;br /&gt;
Diese Funktion wurde aus Gründen der Modularisierung in die eigene Datei &amp;quot;log.js&amp;quot; ausgelagert.&lt;br /&gt;
Öffnen Sie diese Datei und machen Sie sich zunächst mit dem Code vertraut.&lt;br /&gt;
&lt;br /&gt;
Versuchen Sie nun herauszufinden, welche Ausgaben die einzelnen folgenden Code-Blöcke verursachen.&lt;br /&gt;
Validieren Sie Ihre Annahmen, indem Sie den Code in die &amp;quot;index.js&amp;quot; kopieren und die Seite &amp;quot;index.html&amp;quot; im Browser aufrufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
logger.log(spielerName1);&lt;br /&gt;
var spielerName1 = &#039;Paul&#039;;&lt;br /&gt;
&lt;br /&gt;
var spielerName2 = &#039;Peter&#039;;&lt;br /&gt;
logger.log(spielerName2);&lt;br /&gt;
&lt;br /&gt;
window.spielerName3 = &#039;Hans&#039;;&lt;br /&gt;
logger.log(spielerName3);&lt;br /&gt;
&lt;br /&gt;
var punktzahl1;&lt;br /&gt;
logger.log(punktzahl1);&lt;br /&gt;
&lt;br /&gt;
var punktzahl2 = 100 / &#039;a&#039;;&lt;br /&gt;
logger.log(punktzahl2);&lt;br /&gt;
&lt;br /&gt;
var punktzahl3 = 017;&lt;br /&gt;
logger.log(punktzahl3);&lt;br /&gt;
&lt;br /&gt;
logger.log(1.000 == 1);&lt;br /&gt;
&lt;br /&gt;
var begruessung = &#039;Hallo Spieler!&#039; + &#039; &#039; + &#039;Start in &#039; + 5 + &#039; Sekunden&#039;;&lt;br /&gt;
logger.log(begruessung);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Log-Funktion erweitern===&lt;br /&gt;
&lt;br /&gt;
Im Folgenden geht es darum die Funktion &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; in der Datei &amp;quot;log.js&amp;quot; zu erweitern.&lt;br /&gt;
Platzieren Sie Ihren Code direkt am Anfang der Funktion bevor der Wert von &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; in die Seite eingefügt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Leerer String====&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe des Loggers ist bei leeren Zeichenketten nicht besonders aussagekräftig.&lt;br /&gt;
Erweitern Sie den Code so, dass anstelle von leeren Zeichenketten der String &amp;quot;(empty string)&amp;quot; ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Validieren Sie die Funktionalität, indem Sie in der &amp;quot;index.js&amp;quot; &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; mit einem leeren String aufrufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Booleans, Null und Undefined====&lt;br /&gt;
&lt;br /&gt;
Auch bei den boolschen Werten &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; sowie &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; kann die Ausgabe missverständlich sein.&lt;br /&gt;
Können Sie sich denken warum?&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie den Code wie folgt:&lt;br /&gt;
* handelt es sich um einen boolschen Wert soll die Zeichenkette &amp;quot;(boolean)&amp;quot; angehängt werden&lt;br /&gt;
* handelt es sich um Null soll die Zeichenkette &amp;quot;(null)&amp;quot; angehängt werden&lt;br /&gt;
* handelt es sich um Undefined soll die Zeichenkette &amp;quot;(undefined)&amp;quot; angehängt werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Validieren Sie die Funktionalität, indem Sie in der &amp;quot;index.js&amp;quot; &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; mit den entsprechenden Werten aufrufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Aktuelles Datum====&lt;br /&gt;
&lt;br /&gt;
Bei Log-Nachrichten ist es immer sinnvoll zu wissen zu welchem Zeitpunkt diese erstellt wurden.&lt;br /&gt;
Mithilfe des Ausdrucks &amp;lt;code&amp;gt;new Date()&amp;lt;/code&amp;gt; bekommen Sie ein Datumsobjekt welches das aktuelle Datum vorhält.&lt;br /&gt;
&lt;br /&gt;
Erweitern Sie die Log-Funktion so, dass &#039;&#039;&#039;vor&#039;&#039;&#039; jeder Nachricht das aktuelle Datum mit ausgegeben wird.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_2&amp;diff=38239</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 1:Teil 2</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_2&amp;diff=38239"/>
		<updated>2015-10-01T21:03:56Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 1, Teil 1=  ==Eine erste JavaScript-Anwendung: Hello World==  ===Ziel===  Ziel dieser Aufgabe ist eine HTML5/JavaScript-Anwendung zu erstell…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 1, Teil 1=&lt;br /&gt;
&lt;br /&gt;
==Eine erste JavaScript-Anwendung: Hello World==&lt;br /&gt;
&lt;br /&gt;
===Ziel===&lt;br /&gt;
&lt;br /&gt;
Ziel dieser Aufgabe ist eine HTML5/JavaScript-Anwendung zu erstellen,&lt;br /&gt;
welche die Nachricht &amp;quot;Hello World&amp;quot; als Text im Browser ausgibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===HTML-Datei erstellen===&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine neue HTML-Datei mittels Rechtsklick auf den Projektordner und dann Klick auf &amp;quot;New&amp;quot; -&amp;gt; &amp;quot;HTML File&amp;quot;.&lt;br /&gt;
Benennen Sie Datei &amp;quot;index.html&amp;quot; und füllen Sie diese anschließend mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;JavaScript-Praktikum; Aufgabe 1; Teil 2&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles was an Markup benötigt wird für ein valides HTML5-Dokument.&lt;br /&gt;
Weitere Meta-Anweisungen sind durchaus sinnvoll, allerdings nicht benötigt für die folgenden Beispiele.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie die Seite im Browser mittels Rechtsklick auf die Datei und dann Klick auf &amp;quot;Open in Browser&amp;quot; -&amp;gt; &amp;quot;Firefox&amp;quot;.&lt;br /&gt;
Sie sollten eine komplett weiße Seite sehen. Sichern Sie den aktuellen Stand vom Projekt im Repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===JavaScript-Code hinzufügen===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten um ein HTML-Dokument um JavaScript-Code zu erweitern:&lt;br /&gt;
&lt;br /&gt;
* Direkte Einbettung mittels Inline-Code in einem &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/code&amp;gt;-Tag&lt;br /&gt;
* Referenzierung einer externen Datei mittels &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/code&amp;gt;-Tag&lt;br /&gt;
&lt;br /&gt;
Die direkte Einbettung von JavaScript-Code sollte wenn möglich vermieden werden.&lt;br /&gt;
Das Auslagern des Codes in eine separate Datei hat folgende Vorteile:&lt;br /&gt;
&lt;br /&gt;
* Der Code ist sauber getrennt vom HTML (Seperation of Concerns)&lt;br /&gt;
* Der JavaScript-Code kann in mehreren HTML-Dateien eingesetzt werden (Don&#039;t Repeat Yourself).&lt;br /&gt;
* Die Ladezeit der Seite ist besser, da der JavaScript-Code im Browser-Cache gespeichert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Hauptdatei erstellen====&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine neue JS-Datei mittels Rechtsklick auf den Ordner und dann Klick auf &amp;quot;New&amp;quot; -&amp;gt; &amp;quot;JavaScript File&amp;quot;.&lt;br /&gt;
Benennen Sie Datei &amp;quot;index.js&amp;quot; und fügen Sie folgenden Code in diese ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var log = function(message) {&lt;br /&gt;
  document.querySelector(&#039;.messages&#039;).innerHTML += &#039;&amp;lt;div class=&amp;quot;message&amp;quot;&amp;gt;&#039; + message + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
log(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der JavaScript-Code stellt eine Log-Funktion bereit, welche mithilfe der DOM-API Nachrichten in die Seite ausgeben kann.&lt;br /&gt;
Nach dem Laden der HTML-Seite wird der Logger initial benutzt um die Nachricht &amp;quot;Hello World&amp;quot; auszugeben.&lt;br /&gt;
&lt;br /&gt;
Ändern Sie dann das HTML-Dokument wie folgt ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;JavaScript-Praktikum; Aufgabe 1; Teil 2&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1 class=&amp;quot;headline&amp;quot;&amp;gt;Logged messages&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;index.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie die Seite erneut im Browser. Nun sollten Sie die Nachricht &amp;quot;Hello World&amp;quot; sehen.&lt;br /&gt;
Sichern Sie den aktuellen Stand im Repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Dateien aufsplitten====&lt;br /&gt;
&lt;br /&gt;
In den meisten Projekten ist es empfehlenswert, den JavaScript-Code in mehrere modulare Dateien aufzusplitten.&lt;br /&gt;
Bei der Einbindung dieser muss dann allerdings die Reihenfolge beachtet werden.&lt;br /&gt;
Der Browser lädt und evaluiert den Code in der Reihenfolge der eingebetteten &amp;lt;code&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/code&amp;gt;-Tags.&lt;br /&gt;
&lt;br /&gt;
Teilen Sie nun den Code in der Datei &amp;quot;index.js&amp;quot; so auf, dass die Log-Funktion in einer eigenen Datei &amp;quot;log.js&amp;quot; liegt.&lt;br /&gt;
Die Datei &amp;quot;index.js&amp;quot; soll also nur noch den Aufruf der Log-Funktion mit der Nachricht &amp;quot;Hello World&amp;quot; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Ändern Sie dann das HTML-Dokument wie folgt ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;JavaScript-Praktikum; Aufgabe 1; Teil 2&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1 class=&amp;quot;headline&amp;quot;&amp;gt;Logged messages&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;log.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;index.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Tauschen Sie testweise die Reihenfolge der JavaScript-Dateien. Was denken Sie, was passieren wird?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Styling===&lt;br /&gt;
&lt;br /&gt;
Um die visuelle Darstellung von HTML-Seiten zu steuern werden Cascading Style Sheets (CSS) verwendet.&lt;br /&gt;
Ebenso wie JavaScript kann CSS auf zwei Weisen in einem HTML-Dokument verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Direkte Einbettung mittels Inline-Code in einem &amp;lt;code&amp;gt;&amp;lt;style&amp;gt;&amp;lt;/code&amp;gt;-Tag&lt;br /&gt;
* Referenzierung einer externen Datei mittels &amp;lt;code&amp;gt;&amp;lt;link&amp;gt;&amp;lt;/code&amp;gt;-Tag&lt;br /&gt;
&lt;br /&gt;
Die gleichen Gründe wie bei JavaScript sprechen dafür das CSS in eine externe Datei auszulagern.&lt;br /&gt;
Legen Sie dazu eine neue CSS-Datei names &amp;lt;code&amp;gt;index.css&amp;lt;/code&amp;gt; an und fügen Sie folgenden Inhalt ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
html, body {&lt;br /&gt;
  font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.headline {&lt;br /&gt;
  font-size: 35px;&lt;br /&gt;
  font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.messages {&lt;br /&gt;
  background-color: #000;&lt;br /&gt;
  color: #FFF;&lt;br /&gt;
  padding: 20px;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.message {&lt;br /&gt;
  margin: 0 0 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.message:last-child {&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ändern Sie dann das HTML-Dokument wie folgt ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;JavaScript-Praktikum; Aufgabe 1; Teil 1&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;index.css&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1 class=&amp;quot;headline&amp;quot;&amp;gt;Logged messages&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;log.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;index.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie die Seite erneut im Browser. Diese sollte nun eine andere visuelle Darstellung aufweisen.&lt;br /&gt;
Sie können das Styling Ihren Wünschen entsprechend verändern. Sichern Sie dann den aktuellen Stand im Repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Weitere Nachrichten ausgeben===&lt;br /&gt;
&lt;br /&gt;
Die mittels JavaScript erstellte Log-Funktion bietet die Möglichkeit beliebige Nachrichten auszugeben.&lt;br /&gt;
Erweitern Sie den Code nun so, dass nach der Nachricht &amp;quot;Hello World&amp;quot; die Nachricht &amp;quot;How are you doing?&amp;quot; ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Konsole verwenden===&lt;br /&gt;
&lt;br /&gt;
In vielen Fällen kann die Browser-Konsole dabei unterstützen Fehler zu finden oder Probleme zu analysieren.&lt;br /&gt;
In den meisten Browsern finden Sie einen Einstieg in die Entwicklertools mittels Rechtsklick -&amp;gt; &amp;quot;Inspect element&amp;quot;.&lt;br /&gt;
Daraufhin öffnet sich eine Leiste mit unterschiedlichen Werkzeugen wie dem DOM Inspector und auch der Konsole.&lt;br /&gt;
&lt;br /&gt;
Die Konsole hat zwei wesentliche Kernfunktionen.&lt;br /&gt;
Zum einen stellt Sie eine JavaScript-API bereit welche Nachrichten entgegennimmt und diese dann ausgibt.&lt;br /&gt;
Dies können Informationen, Warnung und auch Fehler der aktuell geladenen Seite sein.&lt;br /&gt;
Laufzeitfehler der aktuellen Seite führen implizit zu einem Fehler-Eintrag in der Konsole.&lt;br /&gt;
Zum anderen ermöglicht die Konsole meist beliebigen JavaScript-Code im Kontext der aktuellen Seite auszuführen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie zunächst die Konsole und machen Sie sich mit der Ansicht vertraut.&lt;br /&gt;
Geben Sie anschließend in die untere Eingabezeile der Konsole &amp;lt;code&amp;gt;console.log(&#039;Hello World&#039;);&amp;lt;/code&amp;gt; ein und drücken Sie Enter.&lt;br /&gt;
Dies führt dazu dass die Nachricht &amp;quot;Hello World&amp;quot; in der Konsole ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Versuchen Sie abschließend aus der Konsole heraus das Logger-Objekt der aktuellen HTML-Seite anzusteuern und die Nachricht&lt;br /&gt;
&amp;quot;called from the console&amp;quot; auszugeben.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38238</id>
		<title>MMProg:WiSe2015:Praktikum:Aufgabe 1:Teil 1</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=MMProg:WiSe2015:Praktikum:Aufgabe_1:Teil_1&amp;diff=38238"/>
		<updated>2015-10-01T21:00:35Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „=Praktikumsaufgabe 1, Teil 1=  ==Einrichtung der Arbeitsumgebung==  ===Ziele===  * Installation und Konfiguration von WebStorm * Checkout des Repositories der…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Praktikumsaufgabe 1, Teil 1=&lt;br /&gt;
&lt;br /&gt;
==Einrichtung der Arbeitsumgebung==&lt;br /&gt;
&lt;br /&gt;
===Ziele===&lt;br /&gt;
&lt;br /&gt;
* Installation und Konfiguration von WebStorm&lt;br /&gt;
* Checkout des Repositories der Lehrveranstaltung&lt;br /&gt;
* Checkout des eigenen Subversion-Repositories&lt;br /&gt;
* Verbinden des Repositories mit der WebStorm IDE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation von Webstorm===&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich zunächst [http://www.jetbrains.com/webstorm/ Webstorm] herunter und installieren Sie es.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Auf Rechnern der Hochschule ist Webstorm bereits vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Lizenz====&lt;br /&gt;
&lt;br /&gt;
Als Student der Hochschule Augsburg erhalten Sie mit Ihrer Hochschul-E-Mail-Adresse eine kostenlose Studentenlizenz.&lt;br /&gt;
Gehen Sie dazu auf die [https://www.jetbrains.com/estore/students/ Antragsseite] und füllen Sie das Formular aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Falls Sie an einem Rechner der Hochschule arbeiten können Sie die Hochschullizenz verwenden.&lt;br /&gt;
Bitte kontaktieren Sie den Lehrbeauftragten / Professor um den Lizenzschlüssel zu erhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IDE-Konfiguration====&lt;br /&gt;
&lt;br /&gt;
Webstorm ist auf die Entwicklung mit HTML, CSS und JavaScript ausgelegt, wodurch sich die Konfiguration einfach gestaltet.&lt;br /&gt;
&lt;br /&gt;
Stellen Sie sicher dass unter &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;&lt;br /&gt;
auf jeden Fall folgende Plugins aktiviert sind (diese sollte standardmäßig der Fall sein):&lt;br /&gt;
&lt;br /&gt;
* JavaScript Support&lt;br /&gt;
* Subversion Integration&lt;br /&gt;
&lt;br /&gt;
Verifizieren Sie außerdem dass unter &amp;quot;Project settings&amp;quot; -&amp;gt; &amp;quot;JavaScript&amp;quot; die &amp;quot;JavaScript language version&amp;quot; auf&lt;br /&gt;
&amp;quot;ECMAScript 5.1&amp;quot; eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Code-Style====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig sind vier Leerzeichen als Einrückung für Code-Formattierungen eingestellt.&lt;br /&gt;
Eine Vorgabe dafür gibt es nicht, die Empfehlung sind aber zwei Leerzeichen aufgrund der häufigeren Verwendung.&lt;br /&gt;
&lt;br /&gt;
Um diese Einstellung zu ändern klicken Sie jeweils auf &amp;quot;JavaScript&amp;quot;, &amp;quot;CSS&amp;quot; und &amp;quot;HTML&amp;quot; und tragen bei &amp;quot;Tab size&amp;quot;,&lt;br /&gt;
&amp;quot;Indent&amp;quot; und &amp;quot;Continuation Indent&amp;quot; die gewünsche Zahl an Leerzeichen ein.&lt;br /&gt;
&lt;br /&gt;
Vermeiden Sie in jedem Fall das Tab-Zeichen zu verwenden, da dies nicht genormt ist und je nach Betriebssystem anders aussieht.&lt;br /&gt;
&lt;br /&gt;
====Markdown====&lt;br /&gt;
&lt;br /&gt;
Die Anmerkungen zu den Praktikumsaufgaben sind im Repository als&lt;br /&gt;
[https://de.wikipedia.org/wiki/Markdown Markdown]-Dokumente abgespeichert.&lt;br /&gt;
Für Syntax Highlighting und eine Vorschauansicht müssen Sie das entsprechende Plugin installieren.&lt;br /&gt;
Dazu gehen Sie auf &amp;quot;Webstorm&amp;quot; -&amp;gt; &amp;quot;Preferences&amp;quot; -&amp;gt; &amp;quot;IDE Settings&amp;quot; -&amp;gt; &amp;quot;Plugins&amp;quot;,&lt;br /&gt;
suchen dort nach &amp;quot;Markdown&amp;quot; und klicken anschließend auf &amp;quot;Browse&amp;quot;.&lt;br /&gt;
Es erscheint dann ein Plugin namens &amp;quot;Markdown&amp;quot;.&lt;br /&gt;
Installieren Sie dieses und starten Webstorm danach neu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Checkout der Repositories==&lt;br /&gt;
&lt;br /&gt;
Der folgende Abschnitt beschreibt eine exemplarische Verwendung von Subversion in der Kommandozeile um&lt;br /&gt;
die für das Praktikum notwendigen Repositories auf dem lokalen Rechner einzurichten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Alternativ können Sie die folgenden Schritte auch mit TortoiseSVN, svnX oder auch&lt;br /&gt;
mit dem integrierten Subversion-Support in Webstorm durchführen.&lt;br /&gt;
&lt;br /&gt;
Es ist &#039;&#039;&#039;nicht&#039;&#039;&#039; notwendig jedes Mal die Kommandozeile zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf Windows===&lt;br /&gt;
&lt;br /&gt;
* TortoiseSVN inklusive Command Line Tools [http://glossar.hs-augsburg.de/Installation_von_Tortoise_%28Windows%29 installieren]&lt;br /&gt;
* Alternativ SlikSVN [https://sliksvn.com/ installieren]&lt;br /&gt;
* Im Explorer zum gewünschten Ordner navigieren in dem die Daten gespeichert werden sollen (z.B. C:\studium)&lt;br /&gt;
* Shift + Rechtsklick -&amp;gt; &amp;quot;Eingabeaufforderung hier öffnen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung auf OSX===&lt;br /&gt;
&lt;br /&gt;
* Optional: svnX [http://glossar.hs-augsburg.de/Subversion/HowTo#svnX installieren]&lt;br /&gt;
* Terminal öffnen&lt;br /&gt;
* In den gewünschen Ordner bzw. auf den Desktop gehen: &amp;lt;code&amp;gt;cd Desktop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Arbeitsschritte===&lt;br /&gt;
&lt;br /&gt;
* Ordner erstellen: &amp;lt;code&amp;gt;mkdir mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd mmprog&amp;lt;/code&amp;gt;&lt;br /&gt;
* SVN testen: &amp;lt;code&amp;gt;svn list https://praktikum.multimedia.hs-augsburg.de/&amp;lt;/code&amp;gt;&lt;br /&gt;
* Falls nachgefragt wird das Zertifikat der Hochschule zu speichern, dann mit &amp;quot;p&amp;quot; bestätigen&lt;br /&gt;
* Lehrveranstaltung auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/lawrence/ lehrveranstaltung --username rz-kennung&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner verlassen: &amp;lt;code&amp;gt;cd ..&amp;lt;/code&amp;gt;&lt;br /&gt;
* Eigenes Repository auschecken: &amp;lt;code&amp;gt;svn checkout https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd repository&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;aufgabe1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Initial commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner betreten: &amp;lt;code&amp;gt;cd aufgabe1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner &amp;quot;teil1&amp;quot; anlegen: &amp;lt;code&amp;gt;mkdir teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ordner im SVN adden: &amp;lt;code&amp;gt;svn add teil1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit ausführen: &amp;lt;code&amp;gt;svn commit -m &amp;quot;Second commit.&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nun können Sie Webstorm öffnen und auf &amp;quot;Open Directory&amp;quot; klicken. Wählen Sie dann den Ordner &amp;quot;aufgabe1&amp;quot; aus&lt;br /&gt;
* &#039;&#039;&#039;Anmerkung für OSX:&#039;&#039;&#039; Falls Sie den Ordner auf dem Desktop erzeugt haben können Sie diesen über den Finder verschieben&lt;br /&gt;
&lt;br /&gt;
Falls Sie auf OSX ein Problem damit haben das Zertifikat zu akzeptieren führen Sie folgenden Befehl aus:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo svn list https://praktikum.multimedia.hs-augsburg.de/&amp;lt;/code&amp;gt;&lt;br /&gt;
Da der Befehl als superuser ausgeführt wird müssen Sie Ihr lokales Rechner-Passwort eingeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Projekt aktuell halten===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie mit der Bearbeitung Ihres Projektes aufhören sollten Sie stets den aktuellen Stand in Ihrem Repository sichern.&lt;br /&gt;
Webstorm verfügt über integrierten Subversion-Support und erkennt automatisch welche Operationen auszuführen sind.&lt;br /&gt;
Das bedeutet es ist &#039;&#039;&#039;nicht notwendig alle SVN-Befehle immer manuell über das Terminal auszuführen&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Verschieben oder Löschen Sie keine Dateien im Explorer/Finder ohne die entsprechenden SVN-Operationen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nach Änderungen den Commit-Dialog:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Commit Directory&amp;quot;&lt;br /&gt;
* Verifizieren, dass alle zu speicherenden Dateien angehakt sind&lt;br /&gt;
* Eine entsprechende Commit-Message eingeben&lt;br /&gt;
* &amp;quot;OK&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine rot markierte Datei bedeutet, dass WebStorm diese nicht als Teil des Repositories erkennt.&lt;br /&gt;
Machen Sie dann einen Rechtsklick auf die Datei und wählen &amp;quot;SVN&amp;quot; -&amp;gt; &amp;quot;Add...&amp;quot; aus um die Datei hinzuzufügen.&lt;br /&gt;
Beim &#039;&#039;&#039;nächsten Commit&#039;&#039;&#039; wird die Datei dann mit auf den SVN-Server übertragen.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie auf einem anderen Rechner an diesem Projekt weiterarbeiten wollen,&lt;br /&gt;
müssen sie beim ersten Mal das Projekt in der oben beschriebenen Weise aus dem Repository auf Ihren Rechner laden.&lt;br /&gt;
Wenn Sie dies einmal gemacht haben, reicht es wenn Sie künftig die lokale Version wie folgt aktualisieren,&lt;br /&gt;
bevor Sie mit der Arbeit beginnen:&lt;br /&gt;
&lt;br /&gt;
* Im Projektexplorer Rechtsklick auf das aktuelle Projekt&lt;br /&gt;
* Klick auf &amp;quot;Subversion&amp;quot;&lt;br /&gt;
* Klick auf &amp;quot;Update Directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Repository im Browser einsehen===&lt;br /&gt;
&lt;br /&gt;
Sie können Ihr Repository jederzeit im Browser einsehen und so verifizieren, dass der aktuelle Stand online ist.&lt;br /&gt;
Rufen Sie dazu folgende URL auf: &amp;lt;code&amp;gt;https://praktikum.multimedia.hs-augsburg.de/svn/rz-kennung&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38237</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38237"/>
		<updated>2015-10-01T20:54:24Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Sichere Verwendung in Konstruktorfunktionen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  return {&lt;br /&gt;
    name: vorname,&lt;br /&gt;
    punktzahl: 0&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erzwingung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen, dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (!(this instanceof Spieler)) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann überprüft werden ob &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt zeigt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (this === window) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alternative==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Wichtiger ist jedoch die effiziente Wiederverwendung wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es auch andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function(name) {&lt;br /&gt;
  return {name: name};&lt;br /&gt;
}&lt;br /&gt;
var spieler1 = erstelleSpieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für simple Datentypen funktioniert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator erwartungsgemäß.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof spieler1 ist &#039; + typeof spieler1);&lt;br /&gt;
&lt;br /&gt;
var spieler2 = null;&lt;br /&gt;
console.log(&#039;typeof spieler2 ist &#039; + typeof spieler2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(&#039;getType() von spieler1 ist &#039; + getType(spieler1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt bei Aufruf die Funktion selbst aus und akzeptiert zwei Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array, welches als Liste von Argumenten für den Aufrufe verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(hoch) {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe.apply(person1, [true]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt, auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente, welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann auf unterschiedliche Arten umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(spieler, hoch) {&lt;br /&gt;
  console.log(spieler.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe(spieler1, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht den Zugriff auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript (bis ECMAScript 5) kann man nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird erzeugt, wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var log1 = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
log1(&#039;Hello World&#039;);&lt;br /&gt;
var log2 = erzeugeLogFunktion(&#039;Message:&#039;);&lt;br /&gt;
log2(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures kann der Zugriff von Variablen innerhalb von Konstruktoren auf die inneren Funktionen beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var kuerzel = name.charAt(0);&lt;br /&gt;
  this.hatKuerzel = function(zuPruefendesKuerzel) {&lt;br /&gt;
    return kuerzel === zuPruefendesKuerzel;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1.hatKuerzel(&#039;J&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures sind schwer zu verstehen sein und erfordern einen sicheren Umgang mit JavaScript.&lt;br /&gt;
Eine Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this._name = name;&lt;br /&gt;
  this._punktzahl = 0;&lt;br /&gt;
  this.hatNamen = function(name) {&lt;br /&gt;
    return this._name === name;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Syntax hat keine Auswirkung auf den Zugriff, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38236</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38236"/>
		<updated>2015-10-01T20:53:51Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Kapselung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  return {&lt;br /&gt;
    name: vorname,&lt;br /&gt;
    punktzahl: 0&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erzwingung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen, dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (!(this instanceof Spieler)) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann überprüft werden ob &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt zeigt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (this === window) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alternative==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Wichtiger ist jedoch die effiziente Wiederverwendung wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es auch andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function(name) {&lt;br /&gt;
  return {name: name};&lt;br /&gt;
}&lt;br /&gt;
var spieler1 = erstelleSpieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für simple Datentypen funktioniert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator erwartungsgemäß.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof spieler1 ist &#039; + typeof spieler1);&lt;br /&gt;
&lt;br /&gt;
var spieler2 = null;&lt;br /&gt;
console.log(&#039;typeof spieler2 ist &#039; + typeof spieler2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(&#039;getType() von spieler1 ist &#039; + getType(spieler1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt bei Aufruf die Funktion selbst aus und akzeptiert zwei Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array, welches als Liste von Argumenten für den Aufrufe verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(hoch) {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe.apply(person1, [true]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt, auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente, welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann auf unterschiedliche Arten umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(spieler, hoch) {&lt;br /&gt;
  console.log(spieler.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe(spieler1, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Anmerkung:* Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht den Zugriff auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript (bis ECMAScript 5) kann man nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird erzeugt, wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var log1 = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
log1(&#039;Hello World&#039;);&lt;br /&gt;
var log2 = erzeugeLogFunktion(&#039;Message:&#039;);&lt;br /&gt;
log2(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures kann der Zugriff von Variablen innerhalb von Konstruktoren auf die inneren Funktionen beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var kuerzel = name.charAt(0);&lt;br /&gt;
  this.hatKuerzel = function(zuPruefendesKuerzel) {&lt;br /&gt;
    return kuerzel === zuPruefendesKuerzel;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1.hatKuerzel(&#039;J&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures sind schwer zu verstehen sein und erfordern einen sicheren Umgang mit JavaScript.&lt;br /&gt;
Eine Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this._name = name;&lt;br /&gt;
  this._punktzahl = 0;&lt;br /&gt;
  this.hatNamen = function(name) {&lt;br /&gt;
    return this._name === name;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Syntax hat keine Auswirkung auf den Zugriff, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38235</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38235"/>
		<updated>2015-10-01T20:53:34Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Prototypen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  return {&lt;br /&gt;
    name: vorname,&lt;br /&gt;
    punktzahl: 0&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erzwingung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen, dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (!(this instanceof Spieler)) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann überprüft werden ob &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt zeigt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (this === window) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alternative==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Wichtiger ist jedoch die effiziente Wiederverwendung wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es auch andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function(name) {&lt;br /&gt;
  return {name: name};&lt;br /&gt;
}&lt;br /&gt;
var spieler1 = erstelleSpieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für simple Datentypen funktioniert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator erwartungsgemäß.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof spieler1 ist &#039; + typeof spieler1);&lt;br /&gt;
&lt;br /&gt;
var spieler2 = null;&lt;br /&gt;
console.log(&#039;typeof spieler2 ist &#039; + typeof spieler2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(&#039;getType() von spieler1 ist &#039; + getType(spieler1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt bei Aufruf die Funktion selbst aus und akzeptiert zwei Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array, welches als Liste von Argumenten für den Aufrufe verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(hoch) {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe.apply(person1, [true]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt, auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente, welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann auf unterschiedliche Arten umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(spieler, hoch) {&lt;br /&gt;
  console.log(spieler.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe(spieler1, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Anmerkung:* Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der folgende Abschnitt ist optional und für das Eigenstudium. Er ist nicht vorlesungs-/prüfungsrelevant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
In JavaScript spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;lt;code&amp;gt;prototype&amp;lt;/code&amp;gt;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;lt;code&amp;gt;constructor&amp;lt;/code&amp;gt;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototyp = Spieler.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird, erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype = {&lt;br /&gt;
  erstelleKuerzel: function() {&lt;br /&gt;
    return this.name.charAt(0);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(&#039;Prototyp: &#039; + Object.getPrototypeOf(spieler));&lt;br /&gt;
&lt;br /&gt;
Spieler.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(spieler) == Spieler.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist.&lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleKuerzel = function() {&lt;br /&gt;
  return this.name.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = new Spieler();&lt;br /&gt;
console.log(spieler.erstelleKuerzel());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt.&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Spieler.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man mit vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen helfen.&lt;br /&gt;
Verwendet man einen Konstruktor, der jedem neuen Objekt eine Funktion zuweist, ist das jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  spieler.push(new Spieler());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {};&lt;br /&gt;
Spieler.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
var spieler2 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo == spieler2.sagHallo);&lt;br /&gt;
console.log(spieler1.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
console.log(spieler2.sagHallo == Spieler.prototype.sagHallo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man ein Objekt als Prototypenm, welches auch mit einem Konstruktor erstellt wurde, erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Spieler.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
console.log(spieler1.sagHallo());&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen&lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viele dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38234</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38234"/>
		<updated>2015-10-01T20:52:40Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* this */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  return {&lt;br /&gt;
    name: vorname,&lt;br /&gt;
    punktzahl: 0&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erzwingung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen, dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (!(this instanceof Spieler)) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann überprüft werden ob &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt zeigt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (this === window) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alternative==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Wichtiger ist jedoch die effiziente Wiederverwendung wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es auch andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function(name) {&lt;br /&gt;
  return {name: name};&lt;br /&gt;
}&lt;br /&gt;
var spieler1 = erstelleSpieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für simple Datentypen funktioniert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator erwartungsgemäß.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof spieler1 ist &#039; + typeof spieler1);&lt;br /&gt;
&lt;br /&gt;
var spieler2 = null;&lt;br /&gt;
console.log(&#039;typeof spieler2 ist &#039; + typeof spieler2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(&#039;getType() von spieler1 ist &#039; + getType(spieler1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat in JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit&lt;br /&gt;
nicht als Eigenschaft eines Objekts, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleUndRufeLoggeThisAuf = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
  loggeThis();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
erstelleUndRufeLoggeThisAuf();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var springe = function() {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John&#039;,&lt;br /&gt;
  springe: springe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(spieler1.springe());&lt;br /&gt;
console.log(springe());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird, dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt bei Aufruf die Funktion selbst aus und akzeptiert zwei Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array, welches als Liste von Argumenten für den Aufrufe verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(hoch) {&lt;br /&gt;
  console.log(this.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe.apply(person1, [true]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt, auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente, welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann auf unterschiedliche Arten umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var springe = function(spieler, hoch) {&lt;br /&gt;
  console.log(spieler.name + &#039; springt&#039; + hoch ? &#039; hoch&#039; : &#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
springe(spieler1, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
  this.springe = function() {&lt;br /&gt;
    console.log(this.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.laufe = function() {&lt;br /&gt;
    console.log(this.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem kann durch eine Variable gelöst werden, welche eine Referenz auf &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; vorhält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.name = name;&lt;br /&gt;
  self.springe = function() {&lt;br /&gt;
    console.log(self.name + &#039; springt&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  self.laufe = function() {&lt;br /&gt;
    console.log(self.name + &#039; läuft&#039;);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var fuehreFunktionAus = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
fuehreFunktionAus(spieler1.springe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Anmerkung:* Die Hilfsvariable ist kein Feature von JavaScript und stellt somit einen &amp;quot;Hack&amp;quot; dar.&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38233</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38233"/>
		<updated>2015-10-01T20:51:52Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Konstruktoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine Möglichkeit Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind &#039;&#039;&#039;Konstruktorfunktionen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Spieler());&lt;br /&gt;
console.log(new Spieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen, welche als Konstruktoren dienen, sollten mit einem Großbuchstaben beginnen um sie deutlich zu kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = function() {}; // Falsch&lt;br /&gt;
console.log(spieler()); // ?&lt;br /&gt;
console.log(new spieler()); // ?&lt;br /&gt;
&lt;br /&gt;
var Spieler = function() {}; // Richtig&lt;br /&gt;
console.log(new Spieler()); // !&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler();&lt;br /&gt;
spieler1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  return {&lt;br /&gt;
    name: vorname,&lt;br /&gt;
    punktzahl: 0&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erzwingung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen, dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (!(this instanceof Spieler)) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann überprüft werden ob &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt zeigt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  if (this === window) {&lt;br /&gt;
    throw new Error(&#039;Spieler is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Spieler(&#039;John&#039;));&lt;br /&gt;
console.log(Spieler(&#039;John&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alternative==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Wichtiger ist jedoch die effiziente Wiederverwendung wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es auch andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function(name) {&lt;br /&gt;
  return {name: name};&lt;br /&gt;
}&lt;br /&gt;
var spieler1 = erstelleSpieler(&#039;John&#039;);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für simple Datentypen funktioniert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator erwartungsgemäß.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var spieler1 = new Spieler(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof spieler1 ist &#039; + typeof spieler1);&lt;br /&gt;
&lt;br /&gt;
var spieler2 = null;&lt;br /&gt;
console.log(&#039;typeof spieler2 ist &#039; + typeof spieler2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Spieler = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var spieler1 = new Spieler(&#039;John&#039;);&lt;br /&gt;
console.log(&#039;getType() von spieler1 ist &#039; + getType(spieler1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38232</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38232"/>
		<updated>2015-10-01T20:51:22Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Funktionen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen.&lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu, dass eine Variable mit demselben Namen der Funktion definiert wird, welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet, dass der JavaScript-Interpreter die Funktionsdeklaration vor der&lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel();&lt;br /&gt;
function starteSpiel() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
starteSpiel();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
starteSpiel(); // verursacht Fehler&lt;br /&gt;
var starteSpiel = function() {&lt;br /&gt;
  console.log(&#039;Spiel gestartet!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung:&#039;&#039;&#039; Verwenden Sie immer Funktionsausdrücke, welche Variablen zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise auch nützlich wenn es darum geht&lt;br /&gt;
Funktionen als Argumente oder Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
var spielerName = erstelleSpielerNamen(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(spielerName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {&lt;br /&gt;
  return vorname + &#039; &#039; + nachname;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden nicht belegte Argumente mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; initialisiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerNamen = function(vorname, nachname) {}&lt;br /&gt;
console.log(erstelleSpielerNamen.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpielerKuerzel = function(name) {&lt;br /&gt;
  if (name) {&lt;br /&gt;
    return name.charAt(0).toUpperCase();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(erstelleSpielerKuerzel(&#039;Max&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nachricht = &#039;Hallo Spieler!&#039;;&lt;br /&gt;
var sprache = &#039;deutsch&#039;;&lt;br /&gt;
if (sprache == &#039;englisch&#039;) {&lt;br /&gt;
  // Die bereits bestehende Variable wird überschrieben&lt;br /&gt;
  var nachricht = &#039;Hello Gamer!&#039;;&lt;br /&gt;
}&lt;br /&gt;
console.log(nachricht);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleSpieler = function() {&lt;br /&gt;
  var erstelleName = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstellePunktzahl = function() {&lt;br /&gt;
    return 200;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    name: erstelleName(),&lt;br /&gt;
    punktzahl: erstellePunktzahl()&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleSpieler());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;Max&#039;,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1.springe);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38231</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38231"/>
		<updated>2015-10-01T20:50:47Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Arrays */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mit listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = new Array(10);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte unterschiedlicher Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToeSpielfeld = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
spielerListe[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
spielerListe[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spielerListe.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
spielerListe.length = 10;&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.push(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var spieler1 = personenregister.pop();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [];&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
spielerListe.unshift(spieler1);&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(spielerListe);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ dieser]&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerListe = [{name: &#039;Max Moritz&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; spielerListe.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + spielerListe[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen. &lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu dass eine Variable mit demselben Namen der Funktion definiert wird welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt!&#039;);&lt;br /&gt;
}&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter die Funktionsdeklaration vor der &lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Sag Hallo&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann einem einer Variable zugewiesenen Funktionsausdruck auch eine Funktionsname gegeben werden.&lt;br /&gt;
Dieser kann von dem Funktionskörper selbst verwendet werden um die Funktion zu referenzieren, z.B. bei Rekursion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zeichneAlles = function zeichneNaechstesObjekt() {&lt;br /&gt;
  // ...&lt;br /&gt;
  zeichneNaechstesObjekt();&lt;br /&gt;
}&lt;br /&gt;
zeichneAlles();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Persönlich hatte ich noch nie Verwendung dafür.&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
var name = kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {}&lt;br /&gt;
console.log(addiere.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sindArgumenteGegeben = function() {&lt;br /&gt;
  if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(sindArgumenteGegeben());&lt;br /&gt;
console.log(sindArgumenteGegeben(1)));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(anonymer) Funktionsausdruck==&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise nützlich wenn es darum geht &lt;br /&gt;
Funktionen als Argumente zu übergeben oder als Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleFunktion = function() {&lt;br /&gt;
  return function() {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(erstelleFunktion());&lt;br /&gt;
console.log(erstelleFunktion() == erstelleFunktion());&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sucheErstesLeerzeichen = function(eingabe) {&lt;br /&gt;
  var index = 0;&lt;br /&gt;
  for (var index = 0; index &amp;lt; eingabe.length; i++) {&lt;br /&gt;
    if (eingabe.charAt(index) == &#039; &#039;) {&lt;br /&gt;
      index =  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return zaehler;&lt;br /&gt;
}&lt;br /&gt;
console.log(f2());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleName = function() {&lt;br /&gt;
  var erstelleVorname = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstelleNachname = function() {&lt;br /&gt;
    return &#039;Mustermann&#039;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return erstelleVorname() + &#039; &#039; + erstelleNachname();&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var substrahiere = function(a, b) {&lt;br /&gt;
  return addiere(a, -b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var multipliziere = function(a, b) {&lt;br /&gt;
  return a * b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var dividiere = function(a, b) {&lt;br /&gt;
  return a / b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
taschenrechner.substrahiere = substrahiere;&lt;br /&gt;
taschenrechner.multipliziere = multipliziere;&lt;br /&gt;
taschenrechner.dividiere = dividiere;&lt;br /&gt;
&lt;br /&gt;
taschenrechner.teileGanzzahl = function() {&lt;br /&gt;
  return Math.flor(dividiere(a, b));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38230</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38230"/>
		<updated>2015-10-01T20:50:14Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Objekte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver ist ein Objekt.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar mit einem String als Schlüssel und einem beliebigen Typ als Wert.&lt;br /&gt;
&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries aus anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt native Objekttypen wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte bereit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Variablen speichern immer Referenzen auf Objekte, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art und Weise ein Objekt zu erstellen ist mithilfe des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objektkonstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = new Object();&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;John Doe&#039;, nickname: &#039;JD&#039;, punktzahl: 0};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält, welche nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&lt;br /&gt;
  name: &#039;John Doe&#039;,&lt;br /&gt;
  punktzahl: 0,&lt;br /&gt;
  springe: function() {&lt;br /&gt;
    console.log(&#039;Spieler springt&#039;);&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
spieler1.springe();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich einen String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(spieler1[&#039;name&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird die erste Variante verwendet, wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;name&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(spieler1, &#039;nickname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {&#039;hat highscore erreicht&#039;: true};&lt;br /&gt;
console.log(spieler1[&#039;hat highscore erreicht&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
console.log(spieler1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften sowohl durch Punktnotation als auch String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {punktzahl: 5};&lt;br /&gt;
spieler1.punktzahl += 5;&lt;br /&gt;
spieler1[&#039;punktzahl&#039;] += 5;&lt;br /&gt;
console.log(spieler1.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Beim schreibenden Zugriff auf eine nicht existente Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Das bedeutet, dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {};&lt;br /&gt;
spieler1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
spieler1.punktzahl = 42;&lt;br /&gt;
spieler1.verwendetGamepad = true;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Untersuchen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {name: &#039;Max Mustermann&#039;, punktzahl: 42, verwendetGamepad: true};&lt;br /&gt;
for (var eigenschaft in spieler1) {&lt;br /&gt;
  if (spieler1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + spieler1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verhindert dabei, dass vererbte Eigenschaften ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mir listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = new Array(10);&lt;br /&gt;
console.log(personenregister.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaft hat allerdings keine Auswirkung auf das tatsächliche Speichervermögen eines Arrays.&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte mit unterschiedlichen Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}, &#039;fehlerhafter Datensatz];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToe = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenregister[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
personenregister[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenreigster = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
personenreigster[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
personenregister.length = 10;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.push(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var person1 = personenregister.pop();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.unshift(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/)&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; personenregister.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + personenregister[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen. &lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu dass eine Variable mit demselben Namen der Funktion definiert wird welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt!&#039;);&lt;br /&gt;
}&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter die Funktionsdeklaration vor der &lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Sag Hallo&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann einem einer Variable zugewiesenen Funktionsausdruck auch eine Funktionsname gegeben werden.&lt;br /&gt;
Dieser kann von dem Funktionskörper selbst verwendet werden um die Funktion zu referenzieren, z.B. bei Rekursion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zeichneAlles = function zeichneNaechstesObjekt() {&lt;br /&gt;
  // ...&lt;br /&gt;
  zeichneNaechstesObjekt();&lt;br /&gt;
}&lt;br /&gt;
zeichneAlles();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Persönlich hatte ich noch nie Verwendung dafür.&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
var name = kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {}&lt;br /&gt;
console.log(addiere.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sindArgumenteGegeben = function() {&lt;br /&gt;
  if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(sindArgumenteGegeben());&lt;br /&gt;
console.log(sindArgumenteGegeben(1)));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(anonymer) Funktionsausdruck==&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise nützlich wenn es darum geht &lt;br /&gt;
Funktionen als Argumente zu übergeben oder als Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleFunktion = function() {&lt;br /&gt;
  return function() {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(erstelleFunktion());&lt;br /&gt;
console.log(erstelleFunktion() == erstelleFunktion());&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sucheErstesLeerzeichen = function(eingabe) {&lt;br /&gt;
  var index = 0;&lt;br /&gt;
  for (var index = 0; index &amp;lt; eingabe.length; i++) {&lt;br /&gt;
    if (eingabe.charAt(index) == &#039; &#039;) {&lt;br /&gt;
      index =  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return zaehler;&lt;br /&gt;
}&lt;br /&gt;
console.log(f2());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleName = function() {&lt;br /&gt;
  var erstelleVorname = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstelleNachname = function() {&lt;br /&gt;
    return &#039;Mustermann&#039;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return erstelleVorname() + &#039; &#039; + erstelleNachname();&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var substrahiere = function(a, b) {&lt;br /&gt;
  return addiere(a, -b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var multipliziere = function(a, b) {&lt;br /&gt;
  return a * b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var dividiere = function(a, b) {&lt;br /&gt;
  return a / b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
taschenrechner.substrahiere = substrahiere;&lt;br /&gt;
taschenrechner.multipliziere = multipliziere;&lt;br /&gt;
taschenrechner.dividiere = dividiere;&lt;br /&gt;
&lt;br /&gt;
taschenrechner.teileGanzzahl = function() {&lt;br /&gt;
  return Math.flor(dividiere(a, b));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38229</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38229"/>
		<updated>2015-10-01T20:49:38Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Kontrollanweisung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollstrukturen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten, dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;null gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;undefined gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
if (!&#039;&#039;) console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
if (!NaN) console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein wird der nachfolgende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var level = 3;&lt;br /&gt;
switch (level) {&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;Level 1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;Level 2&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 10;&lt;br /&gt;
while (countdown--) {&lt;br /&gt;
  console.log(countdown);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme,&lt;br /&gt;
dass der gegebene Schleifenkörper auf jeden Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for..in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver Datentyp ist ein Objekt.&lt;br /&gt;
JavaScript bietet eingebaute/native Objekte wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften. &lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar, wobei der Schlüssel ein String und der Wert von beliebigem Typ ist.&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries.&lt;br /&gt;
&lt;br /&gt;
Variablen speichern immer die Referenz zu Objekten, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art ein Objekt zu erstellen ist mittels des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objekt-Konstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = new Object();&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält die nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  getName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.getName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich eines String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1[&#039;person1&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel wird die erste Variante verwendet wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {vorname: &#039;Max&#039;, nachname: &#039;Mustermann&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;vorname&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;nachname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&#039;mag viele Leerzeichen&#039;: true};&lt;br /&gt;
console.log(person1[&#039;mag viele Leerzeichen&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1.adresse);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften&lt;br /&gt;
sowohl mittels Punktnotation als auch mittels String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {alter: 5};&lt;br /&gt;
person1.alter += 5;&lt;br /&gt;
person1[&#039;alter&#039;] += 5;&lt;br /&gt;
console.log(person1.alter);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim schreibenden Zugriff auf eine nicht existierende Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Dies bedeutet dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.alter = 42;&lt;br /&gt;
person1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
person1.hatBrille = true;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen von Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop in Kombination mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
for (var eigenschaft in person1) {&lt;br /&gt;
  if (person1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + person1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mir listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = new Array(10);&lt;br /&gt;
console.log(personenregister.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaft hat allerdings keine Auswirkung auf das tatsächliche Speichervermögen eines Arrays.&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte mit unterschiedlichen Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}, &#039;fehlerhafter Datensatz];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToe = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenregister[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
personenregister[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenreigster = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
personenreigster[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
personenregister.length = 10;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.push(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var person1 = personenregister.pop();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.unshift(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/)&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; personenregister.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + personenregister[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen. &lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu dass eine Variable mit demselben Namen der Funktion definiert wird welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt!&#039;);&lt;br /&gt;
}&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter die Funktionsdeklaration vor der &lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Sag Hallo&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann einem einer Variable zugewiesenen Funktionsausdruck auch eine Funktionsname gegeben werden.&lt;br /&gt;
Dieser kann von dem Funktionskörper selbst verwendet werden um die Funktion zu referenzieren, z.B. bei Rekursion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zeichneAlles = function zeichneNaechstesObjekt() {&lt;br /&gt;
  // ...&lt;br /&gt;
  zeichneNaechstesObjekt();&lt;br /&gt;
}&lt;br /&gt;
zeichneAlles();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Persönlich hatte ich noch nie Verwendung dafür.&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
var name = kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {}&lt;br /&gt;
console.log(addiere.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sindArgumenteGegeben = function() {&lt;br /&gt;
  if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(sindArgumenteGegeben());&lt;br /&gt;
console.log(sindArgumenteGegeben(1)));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(anonymer) Funktionsausdruck==&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise nützlich wenn es darum geht &lt;br /&gt;
Funktionen als Argumente zu übergeben oder als Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleFunktion = function() {&lt;br /&gt;
  return function() {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(erstelleFunktion());&lt;br /&gt;
console.log(erstelleFunktion() == erstelleFunktion());&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sucheErstesLeerzeichen = function(eingabe) {&lt;br /&gt;
  var index = 0;&lt;br /&gt;
  for (var index = 0; index &amp;lt; eingabe.length; i++) {&lt;br /&gt;
    if (eingabe.charAt(index) == &#039; &#039;) {&lt;br /&gt;
      index =  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return zaehler;&lt;br /&gt;
}&lt;br /&gt;
console.log(f2());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleName = function() {&lt;br /&gt;
  var erstelleVorname = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstelleNachname = function() {&lt;br /&gt;
    return &#039;Mustermann&#039;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return erstelleVorname() + &#039; &#039; + erstelleNachname();&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var substrahiere = function(a, b) {&lt;br /&gt;
  return addiere(a, -b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var multipliziere = function(a, b) {&lt;br /&gt;
  return a * b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var dividiere = function(a, b) {&lt;br /&gt;
  return a / b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
taschenrechner.substrahiere = substrahiere;&lt;br /&gt;
taschenrechner.multipliziere = multipliziere;&lt;br /&gt;
taschenrechner.dividiere = dividiere;&lt;br /&gt;
&lt;br /&gt;
taschenrechner.teileGanzzahl = function() {&lt;br /&gt;
  return Math.flor(dividiere(a, b));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38228</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38228"/>
		<updated>2015-10-01T20:48:52Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Vergleiche */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Typungleicheit werden folgenden Regeln angewendet:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden&lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten für die Typumwandlung.&lt;br /&gt;
Es ist ohne weiteres möglich den Gleichheitsoperator sinnvoll zu verwenden um z.B. Objektreferenzen zu vergleichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = {}, spieler1 = {};&lt;br /&gt;
console.log(spieler1 == spieler1);&lt;br /&gt;
console.log(spieler1 == spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisung=&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist null nicht gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist undefined nicht gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!&#039;&#039;) {&lt;br /&gt;
  console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!NaN) {&lt;br /&gt;
  console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein so wird der nachfolgend stehende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 3;&lt;br /&gt;
switch (countdown) {&lt;br /&gt;
  case 3:&lt;br /&gt;
    console.log(&#039;3&#039;);&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;2&#039;);&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits nicht &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehler = 10;&lt;br /&gt;
while (zaehler--) {&lt;br /&gt;
  console.log(zaehler);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert genauso wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme dass der gegebene auf jeden&lt;br /&gt;
Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler[eigenschaft]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver Datentyp ist ein Objekt.&lt;br /&gt;
JavaScript bietet eingebaute/native Objekte wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften. &lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar, wobei der Schlüssel ein String und der Wert von beliebigem Typ ist.&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries.&lt;br /&gt;
&lt;br /&gt;
Variablen speichern immer die Referenz zu Objekten, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art ein Objekt zu erstellen ist mittels des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objekt-Konstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = new Object();&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält die nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  getName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.getName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich eines String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1[&#039;person1&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel wird die erste Variante verwendet wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {vorname: &#039;Max&#039;, nachname: &#039;Mustermann&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;vorname&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;nachname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&#039;mag viele Leerzeichen&#039;: true};&lt;br /&gt;
console.log(person1[&#039;mag viele Leerzeichen&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1.adresse);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften&lt;br /&gt;
sowohl mittels Punktnotation als auch mittels String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {alter: 5};&lt;br /&gt;
person1.alter += 5;&lt;br /&gt;
person1[&#039;alter&#039;] += 5;&lt;br /&gt;
console.log(person1.alter);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim schreibenden Zugriff auf eine nicht existierende Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Dies bedeutet dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.alter = 42;&lt;br /&gt;
person1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
person1.hatBrille = true;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen von Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop in Kombination mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
for (var eigenschaft in person1) {&lt;br /&gt;
  if (person1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + person1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mir listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = new Array(10);&lt;br /&gt;
console.log(personenregister.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaft hat allerdings keine Auswirkung auf das tatsächliche Speichervermögen eines Arrays.&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte mit unterschiedlichen Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}, &#039;fehlerhafter Datensatz];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToe = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenregister[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
personenregister[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenreigster = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
personenreigster[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
personenregister.length = 10;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.push(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var person1 = personenregister.pop();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.unshift(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/)&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; personenregister.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + personenregister[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen. &lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu dass eine Variable mit demselben Namen der Funktion definiert wird welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt!&#039;);&lt;br /&gt;
}&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter die Funktionsdeklaration vor der &lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Sag Hallo&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann einem einer Variable zugewiesenen Funktionsausdruck auch eine Funktionsname gegeben werden.&lt;br /&gt;
Dieser kann von dem Funktionskörper selbst verwendet werden um die Funktion zu referenzieren, z.B. bei Rekursion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zeichneAlles = function zeichneNaechstesObjekt() {&lt;br /&gt;
  // ...&lt;br /&gt;
  zeichneNaechstesObjekt();&lt;br /&gt;
}&lt;br /&gt;
zeichneAlles();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Persönlich hatte ich noch nie Verwendung dafür.&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
var name = kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {}&lt;br /&gt;
console.log(addiere.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sindArgumenteGegeben = function() {&lt;br /&gt;
  if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(sindArgumenteGegeben());&lt;br /&gt;
console.log(sindArgumenteGegeben(1)));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(anonymer) Funktionsausdruck==&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise nützlich wenn es darum geht &lt;br /&gt;
Funktionen als Argumente zu übergeben oder als Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleFunktion = function() {&lt;br /&gt;
  return function() {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(erstelleFunktion());&lt;br /&gt;
console.log(erstelleFunktion() == erstelleFunktion());&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sucheErstesLeerzeichen = function(eingabe) {&lt;br /&gt;
  var index = 0;&lt;br /&gt;
  for (var index = 0; index &amp;lt; eingabe.length; i++) {&lt;br /&gt;
    if (eingabe.charAt(index) == &#039; &#039;) {&lt;br /&gt;
      index =  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return zaehler;&lt;br /&gt;
}&lt;br /&gt;
console.log(f2());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleName = function() {&lt;br /&gt;
  var erstelleVorname = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstelleNachname = function() {&lt;br /&gt;
    return &#039;Mustermann&#039;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return erstelleVorname() + &#039; &#039; + erstelleNachname();&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var substrahiere = function(a, b) {&lt;br /&gt;
  return addiere(a, -b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var multipliziere = function(a, b) {&lt;br /&gt;
  return a * b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var dividiere = function(a, b) {&lt;br /&gt;
  return a / b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
taschenrechner.substrahiere = substrahiere;&lt;br /&gt;
taschenrechner.multipliziere = multipliziere;&lt;br /&gt;
taschenrechner.dividiere = dividiere;&lt;br /&gt;
&lt;br /&gt;
taschenrechner.teileGanzzahl = function() {&lt;br /&gt;
  return Math.flor(dividiere(a, b));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38227</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38227"/>
		<updated>2015-10-01T20:48:21Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Primitive Datentypen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Null, Undefined, Number, Boolean, String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String werden auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp, welcher nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = null;&lt;br /&gt;
console.log(spieler);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp, welcher ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dieser Wert ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1, spieler2 = null;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp, welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = true, istSpielVerloren = false;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
console.log(istSpielVerloren);&lt;br /&gt;
console.log(istSpielGewonnen === istSpielVerloren);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl = 2000, pi = 3.14;&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var punktzahl1 = 100, punktzahl2 = 100.00;&lt;br /&gt;
console.log(punktzahl1 === punktzahl2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Number API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;Paul&#039;, spieler2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
console.log(spieler1 === spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;John&#039; + &#039; &#039; + &#039;Doe&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spielerName = &#039;John Doe&#039;;&lt;br /&gt;
console.log(&#039;String-Länge: &#039; + spielerName.length);&lt;br /&gt;
console.log(&#039;Als Großbuchstaben: &#039; + spielerName.toUpperCase());&lt;br /&gt;
console.log(&#039;Als Kleinbuchstaben: &#039; + spielerName.toLowerCase());&lt;br /&gt;
console.log(&#039;Position vom ersten &amp;quot;e&amp;quot;: &#039; + spielerName.indexOf(&#039;e&#039;));&lt;br /&gt;
console.log(&#039;Zeichen an Stelle 4: &#039; + spielerName.charAt(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/ dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
Die Umwandlung bei Typungleichheit richtet sich nach den folgenden fünf Regeln:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert wenn sie mit Zahlen verglichen werden&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden &lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten lediglich für die Typumwandlung. Es ist trotzdem ohne weiteres möglich&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Gleichheitsoperator zu verwenden um zum Beispiel Objektreferenzen zu vergleichen.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {}, person2 = {};&lt;br /&gt;
console.log(person1 == person1);&lt;br /&gt;
console.log(person1 == person2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisung=&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist null nicht gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist undefined nicht gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!&#039;&#039;) {&lt;br /&gt;
  console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!NaN) {&lt;br /&gt;
  console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein so wird der nachfolgend stehende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 3;&lt;br /&gt;
switch (countdown) {&lt;br /&gt;
  case 3:&lt;br /&gt;
    console.log(&#039;3&#039;);&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;2&#039;);&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits nicht &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehler = 10;&lt;br /&gt;
while (zaehler--) {&lt;br /&gt;
  console.log(zaehler);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert genauso wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme dass der gegebene auf jeden&lt;br /&gt;
Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler[eigenschaft]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver Datentyp ist ein Objekt.&lt;br /&gt;
JavaScript bietet eingebaute/native Objekte wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften. &lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar, wobei der Schlüssel ein String und der Wert von beliebigem Typ ist.&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries.&lt;br /&gt;
&lt;br /&gt;
Variablen speichern immer die Referenz zu Objekten, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art ein Objekt zu erstellen ist mittels des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objekt-Konstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = new Object();&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält die nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  getName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.getName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich eines String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1[&#039;person1&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel wird die erste Variante verwendet wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {vorname: &#039;Max&#039;, nachname: &#039;Mustermann&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;vorname&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;nachname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&#039;mag viele Leerzeichen&#039;: true};&lt;br /&gt;
console.log(person1[&#039;mag viele Leerzeichen&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1.adresse);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften&lt;br /&gt;
sowohl mittels Punktnotation als auch mittels String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {alter: 5};&lt;br /&gt;
person1.alter += 5;&lt;br /&gt;
person1[&#039;alter&#039;] += 5;&lt;br /&gt;
console.log(person1.alter);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim schreibenden Zugriff auf eine nicht existierende Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Dies bedeutet dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.alter = 42;&lt;br /&gt;
person1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
person1.hatBrille = true;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen von Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop in Kombination mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
for (var eigenschaft in person1) {&lt;br /&gt;
  if (person1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + person1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mir listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = new Array(10);&lt;br /&gt;
console.log(personenregister.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaft hat allerdings keine Auswirkung auf das tatsächliche Speichervermögen eines Arrays.&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte mit unterschiedlichen Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}, &#039;fehlerhafter Datensatz];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToe = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenregister[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
personenregister[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenreigster = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
personenreigster[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
personenregister.length = 10;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.push(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var person1 = personenregister.pop();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.unshift(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/)&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; personenregister.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + personenregister[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen. &lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu dass eine Variable mit demselben Namen der Funktion definiert wird welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt!&#039;);&lt;br /&gt;
}&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter die Funktionsdeklaration vor der &lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Sag Hallo&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann einem einer Variable zugewiesenen Funktionsausdruck auch eine Funktionsname gegeben werden.&lt;br /&gt;
Dieser kann von dem Funktionskörper selbst verwendet werden um die Funktion zu referenzieren, z.B. bei Rekursion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zeichneAlles = function zeichneNaechstesObjekt() {&lt;br /&gt;
  // ...&lt;br /&gt;
  zeichneNaechstesObjekt();&lt;br /&gt;
}&lt;br /&gt;
zeichneAlles();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Persönlich hatte ich noch nie Verwendung dafür.&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
var name = kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {}&lt;br /&gt;
console.log(addiere.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sindArgumenteGegeben = function() {&lt;br /&gt;
  if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(sindArgumenteGegeben());&lt;br /&gt;
console.log(sindArgumenteGegeben(1)));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(anonymer) Funktionsausdruck==&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise nützlich wenn es darum geht &lt;br /&gt;
Funktionen als Argumente zu übergeben oder als Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleFunktion = function() {&lt;br /&gt;
  return function() {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(erstelleFunktion());&lt;br /&gt;
console.log(erstelleFunktion() == erstelleFunktion());&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sucheErstesLeerzeichen = function(eingabe) {&lt;br /&gt;
  var index = 0;&lt;br /&gt;
  for (var index = 0; index &amp;lt; eingabe.length; i++) {&lt;br /&gt;
    if (eingabe.charAt(index) == &#039; &#039;) {&lt;br /&gt;
      index =  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return zaehler;&lt;br /&gt;
}&lt;br /&gt;
console.log(f2());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleName = function() {&lt;br /&gt;
  var erstelleVorname = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstelleNachname = function() {&lt;br /&gt;
    return &#039;Mustermann&#039;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return erstelleVorname() + &#039; &#039; + erstelleNachname();&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var substrahiere = function(a, b) {&lt;br /&gt;
  return addiere(a, -b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var multipliziere = function(a, b) {&lt;br /&gt;
  return a * b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var dividiere = function(a, b) {&lt;br /&gt;
  return a / b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
taschenrechner.substrahiere = substrahiere;&lt;br /&gt;
taschenrechner.multipliziere = multipliziere;&lt;br /&gt;
taschenrechner.dividiere = dividiere;&lt;br /&gt;
&lt;br /&gt;
taschenrechner.teileGanzzahl = function() {&lt;br /&gt;
  return Math.flor(dividiere(a, b));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38226</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38226"/>
		<updated>2015-10-01T20:47:24Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Variablen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei ihrer Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var aktuellePunktzahl;&lt;br /&gt;
aktuellePunktzahl = 2000;&lt;br /&gt;
console.log(aktuellePunktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Variablen können mit Kommas separiert auf einmal deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler1 = &#039;John&#039;, spieler2 = &#039;Jack&#039;;&lt;br /&gt;
console.log(spieler1);&lt;br /&gt;
console.log(spieler2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig, da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = 1;&lt;br /&gt;
istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gegner1, gegner2, gegner3;&lt;br /&gt;
gegner1 = gegner2 = gegner3 = &#039;Monster&#039;;&lt;br /&gt;
console.log(gegner1);&lt;br /&gt;
console.log(gegner2);&lt;br /&gt;
console.log(gegner3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istSpielGewonnen = false;&lt;br /&gt;
var istSpielGewonnen = true;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der Ausführung&lt;br /&gt;
des Codes ()innerhalb der umgebenden Funktion) nach oben schiebt.&lt;br /&gt;
Dies betrifft nur die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man also Code schreiben, der Variablen verwendet bevor sie definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(istSpielGewonnen);&lt;br /&gt;
var istSpielGewonnen = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der&lt;br /&gt;
jewilig umgebenden Funktion zu schreiben.&lt;br /&gt;
Handelt es sich um globale Variable sollte diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jede JavaScript-Umgebung besitzt ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = &#039;John&#039;;&lt;br /&gt;
console.log(&#039;spieler global?&#039;, spieler === window.spieler);&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  var punktzahl = 2000;&lt;br /&gt;
  console.log(&#039;punktzahl global?&#039;, punktzahl === window.punktzahl);&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePunktzahl = function() {&lt;br /&gt;
  punktzahl = 2000;&lt;br /&gt;
}&lt;br /&gt;
erstellePunktzahl();&lt;br /&gt;
console.log(punktzahl);&lt;br /&gt;
console.log(window.punktzahl);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Null, Undefined, Number, Boolean, String&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp der nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Anders als in anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; nicht der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var referenz = null;&lt;br /&gt;
console.log(referenz);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp der ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Undefined ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var referenz1, referenz2 = null;&lt;br /&gt;
console.log(referenz1);&lt;br /&gt;
console.log(referenz1 === referenz2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Die JavaScript-Umgebung stellt eine Variable &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zur Verfügung welche den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; enthält.&lt;br /&gt;
Unglücklicherweise kann diese Variable in manchen JavaScript-Umgebung neu definiert werden.&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istGrasGruen = true, sindBananenBlau = false;&lt;br /&gt;
console.log(istGrasGruen);&lt;br /&gt;
console.log(sindBananenBlau);&lt;br /&gt;
console.log(istGrasGruen === sindBananenBlau);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var monateProJahr = 12, pi = 3.14;&lt;br /&gt;
console.log(monateProJahr);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ganzzahl = 1, gleitkomma = 1.0000;&lt;br /&gt;
console.log(ganzzahl === gleitkomma);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/) MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name1 = &#039;Paul&#039;, name2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(name1);&lt;br /&gt;
console.log(name2);&lt;br /&gt;
console.log(name1 === name2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen selbst in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Max&#039; + &#039; &#039; + &#039;Mustermann&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = &#039;Max Mustermann&#039;;&lt;br /&gt;
console.log(&#039;Name hat eine Länge von &#039; + name.length);&lt;br /&gt;
console.log(&#039;Name als Großbuchstaben: &#039; + name.toUpperCase());&lt;br /&gt;
console.log(&#039;Name als Kleinbuchstaben: &#039; + name.toLowerCase());&lt;br /&gt;
console.log(&#039;Name erstes &amp;quot;e&amp;quot; ist an Position &#039; + name.indexOf(&#039;e&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/) MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
Die Umwandlung bei Typungleichheit richtet sich nach den folgenden fünf Regeln:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert wenn sie mit Zahlen verglichen werden&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden &lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten lediglich für die Typumwandlung. Es ist trotzdem ohne weiteres möglich&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Gleichheitsoperator zu verwenden um zum Beispiel Objektreferenzen zu vergleichen.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {}, person2 = {};&lt;br /&gt;
console.log(person1 == person1);&lt;br /&gt;
console.log(person1 == person2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisung=&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist null nicht gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist undefined nicht gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!&#039;&#039;) {&lt;br /&gt;
  console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!NaN) {&lt;br /&gt;
  console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein so wird der nachfolgend stehende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 3;&lt;br /&gt;
switch (countdown) {&lt;br /&gt;
  case 3:&lt;br /&gt;
    console.log(&#039;3&#039;);&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;2&#039;);&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits nicht &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehler = 10;&lt;br /&gt;
while (zaehler--) {&lt;br /&gt;
  console.log(zaehler);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert genauso wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme dass der gegebene auf jeden&lt;br /&gt;
Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler[eigenschaft]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver Datentyp ist ein Objekt.&lt;br /&gt;
JavaScript bietet eingebaute/native Objekte wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften. &lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar, wobei der Schlüssel ein String und der Wert von beliebigem Typ ist.&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries.&lt;br /&gt;
&lt;br /&gt;
Variablen speichern immer die Referenz zu Objekten, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art ein Objekt zu erstellen ist mittels des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objekt-Konstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = new Object();&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält die nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  getName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.getName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich eines String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1[&#039;person1&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel wird die erste Variante verwendet wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {vorname: &#039;Max&#039;, nachname: &#039;Mustermann&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;vorname&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;nachname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&#039;mag viele Leerzeichen&#039;: true};&lt;br /&gt;
console.log(person1[&#039;mag viele Leerzeichen&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1.adresse);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften&lt;br /&gt;
sowohl mittels Punktnotation als auch mittels String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {alter: 5};&lt;br /&gt;
person1.alter += 5;&lt;br /&gt;
person1[&#039;alter&#039;] += 5;&lt;br /&gt;
console.log(person1.alter);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim schreibenden Zugriff auf eine nicht existierende Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Dies bedeutet dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.alter = 42;&lt;br /&gt;
person1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
person1.hatBrille = true;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen von Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop in Kombination mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
for (var eigenschaft in person1) {&lt;br /&gt;
  if (person1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + person1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mir listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = new Array(10);&lt;br /&gt;
console.log(personenregister.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaft hat allerdings keine Auswirkung auf das tatsächliche Speichervermögen eines Arrays.&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte mit unterschiedlichen Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}, &#039;fehlerhafter Datensatz];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToe = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenregister[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
personenregister[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenreigster = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
personenreigster[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
personenregister.length = 10;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.push(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var person1 = personenregister.pop();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.unshift(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/)&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; personenregister.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + personenregister[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen. &lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu dass eine Variable mit demselben Namen der Funktion definiert wird welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt!&#039;);&lt;br /&gt;
}&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter die Funktionsdeklaration vor der &lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Sag Hallo&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann einem einer Variable zugewiesenen Funktionsausdruck auch eine Funktionsname gegeben werden.&lt;br /&gt;
Dieser kann von dem Funktionskörper selbst verwendet werden um die Funktion zu referenzieren, z.B. bei Rekursion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zeichneAlles = function zeichneNaechstesObjekt() {&lt;br /&gt;
  // ...&lt;br /&gt;
  zeichneNaechstesObjekt();&lt;br /&gt;
}&lt;br /&gt;
zeichneAlles();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Persönlich hatte ich noch nie Verwendung dafür.&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
var name = kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {}&lt;br /&gt;
console.log(addiere.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sindArgumenteGegeben = function() {&lt;br /&gt;
  if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(sindArgumenteGegeben());&lt;br /&gt;
console.log(sindArgumenteGegeben(1)));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(anonymer) Funktionsausdruck==&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise nützlich wenn es darum geht &lt;br /&gt;
Funktionen als Argumente zu übergeben oder als Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleFunktion = function() {&lt;br /&gt;
  return function() {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(erstelleFunktion());&lt;br /&gt;
console.log(erstelleFunktion() == erstelleFunktion());&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sucheErstesLeerzeichen = function(eingabe) {&lt;br /&gt;
  var index = 0;&lt;br /&gt;
  for (var index = 0; index &amp;lt; eingabe.length; i++) {&lt;br /&gt;
    if (eingabe.charAt(index) == &#039; &#039;) {&lt;br /&gt;
      index =  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return zaehler;&lt;br /&gt;
}&lt;br /&gt;
console.log(f2());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleName = function() {&lt;br /&gt;
  var erstelleVorname = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstelleNachname = function() {&lt;br /&gt;
    return &#039;Mustermann&#039;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return erstelleVorname() + &#039; &#039; + erstelleNachname();&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var substrahiere = function(a, b) {&lt;br /&gt;
  return addiere(a, -b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var multipliziere = function(a, b) {&lt;br /&gt;
  return a * b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var dividiere = function(a, b) {&lt;br /&gt;
  return a / b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
taschenrechner.substrahiere = substrahiere;&lt;br /&gt;
taschenrechner.multipliziere = multipliziere;&lt;br /&gt;
taschenrechner.dividiere = dividiere;&lt;br /&gt;
&lt;br /&gt;
taschenrechner.teileGanzzahl = function() {&lt;br /&gt;
  return Math.flor(dividiere(a, b));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38225</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38225"/>
		<updated>2015-10-01T20:46:47Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Schlüsselwörter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract&lt;br /&gt;
boolean break byte&lt;br /&gt;
case catch char class const continue&lt;br /&gt;
debugger default delete do double&lt;br /&gt;
else enum export extends&lt;br /&gt;
false final finally float for function&lt;br /&gt;
goto&lt;br /&gt;
if implements import in instanceof int interface&lt;br /&gt;
long&lt;br /&gt;
native new null&lt;br /&gt;
package private protected public&lt;br /&gt;
return&lt;br /&gt;
short static super switch synchronized&lt;br /&gt;
this throw throws transient true try typeof&lt;br /&gt;
var volatile void&lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientiert sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei der Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tageProWoche = 7;&lt;br /&gt;
console.log(tageProWoche);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tageProWoche;&lt;br /&gt;
tageProWoche = 7;&lt;br /&gt;
console.log(tageProWoche);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var pruefungBestanden = 1;&lt;br /&gt;
pruefungBestanden = true;&lt;br /&gt;
console.log(pruefungBestanden);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tick, trick, track;&lt;br /&gt;
tick = trick = track = &#039;Ente&#039;;&lt;br /&gt;
console.log(tick);&lt;br /&gt;
console.log(trick);&lt;br /&gt;
console.log(track);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var doppeltDeklariert = false;&lt;br /&gt;
var doppeltDeklariert = true;&lt;br /&gt;
console.log(doppeltDeklariert);    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der eigentlichen Ausführung &lt;br /&gt;
des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt. &lt;br /&gt;
Dies betrifft ausschließlich die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man dadurch Code schreiben der Variablen verwendet bevor sie überhaupt definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(nochNichtDeklariert);&lt;br /&gt;
var nochNichtDeklariert = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting weitesgehend zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der &lt;br /&gt;
jewilig umgebenden Funktion zu schreiben. Handelt es sich um globale Variable sollten diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
In der Regel besitzt eine JavaScript-Umgebung ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = new Object();&lt;br /&gt;
console.log(&#039;ist person1 global?&#039;, person1 === window.person1);&lt;br /&gt;
var erstellePerson2 = function() {&lt;br /&gt;
  var person2 = new Object();&lt;br /&gt;
  console.log(&#039;is person2 global?&#039;, person2 === window.person2);&lt;br /&gt;
}&lt;br /&gt;
erstellePerson2();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleGlobaleVariable = function() {&lt;br /&gt;
  globaleVariable = 1;&lt;br /&gt;
}&lt;br /&gt;
erstelleGlobaleVariable();&lt;br /&gt;
console.log(globaleVariable);&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Null, Undefined, Number, Boolean, String&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp der nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Anders als in anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; nicht der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var referenz = null;&lt;br /&gt;
console.log(referenz);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp der ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Undefined ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var referenz1, referenz2 = null;&lt;br /&gt;
console.log(referenz1);&lt;br /&gt;
console.log(referenz1 === referenz2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Die JavaScript-Umgebung stellt eine Variable &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zur Verfügung welche den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; enthält.&lt;br /&gt;
Unglücklicherweise kann diese Variable in manchen JavaScript-Umgebung neu definiert werden.&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istGrasGruen = true, sindBananenBlau = false;&lt;br /&gt;
console.log(istGrasGruen);&lt;br /&gt;
console.log(sindBananenBlau);&lt;br /&gt;
console.log(istGrasGruen === sindBananenBlau);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var monateProJahr = 12, pi = 3.14;&lt;br /&gt;
console.log(monateProJahr);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ganzzahl = 1, gleitkomma = 1.0000;&lt;br /&gt;
console.log(ganzzahl === gleitkomma);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/) MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name1 = &#039;Paul&#039;, name2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(name1);&lt;br /&gt;
console.log(name2);&lt;br /&gt;
console.log(name1 === name2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen selbst in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Max&#039; + &#039; &#039; + &#039;Mustermann&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = &#039;Max Mustermann&#039;;&lt;br /&gt;
console.log(&#039;Name hat eine Länge von &#039; + name.length);&lt;br /&gt;
console.log(&#039;Name als Großbuchstaben: &#039; + name.toUpperCase());&lt;br /&gt;
console.log(&#039;Name als Kleinbuchstaben: &#039; + name.toLowerCase());&lt;br /&gt;
console.log(&#039;Name erstes &amp;quot;e&amp;quot; ist an Position &#039; + name.indexOf(&#039;e&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/) MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
Die Umwandlung bei Typungleichheit richtet sich nach den folgenden fünf Regeln:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert wenn sie mit Zahlen verglichen werden&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden &lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten lediglich für die Typumwandlung. Es ist trotzdem ohne weiteres möglich&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Gleichheitsoperator zu verwenden um zum Beispiel Objektreferenzen zu vergleichen.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {}, person2 = {};&lt;br /&gt;
console.log(person1 == person1);&lt;br /&gt;
console.log(person1 == person2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisung=&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist null nicht gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist undefined nicht gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!&#039;&#039;) {&lt;br /&gt;
  console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!NaN) {&lt;br /&gt;
  console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein so wird der nachfolgend stehende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 3;&lt;br /&gt;
switch (countdown) {&lt;br /&gt;
  case 3:&lt;br /&gt;
    console.log(&#039;3&#039;);&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;2&#039;);&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits nicht &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehler = 10;&lt;br /&gt;
while (zaehler--) {&lt;br /&gt;
  console.log(zaehler);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert genauso wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme dass der gegebene auf jeden&lt;br /&gt;
Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler[eigenschaft]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver Datentyp ist ein Objekt.&lt;br /&gt;
JavaScript bietet eingebaute/native Objekte wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften. &lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar, wobei der Schlüssel ein String und der Wert von beliebigem Typ ist.&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries.&lt;br /&gt;
&lt;br /&gt;
Variablen speichern immer die Referenz zu Objekten, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art ein Objekt zu erstellen ist mittels des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objekt-Konstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = new Object();&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält die nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  getName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.getName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich eines String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1[&#039;person1&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel wird die erste Variante verwendet wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {vorname: &#039;Max&#039;, nachname: &#039;Mustermann&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;vorname&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;nachname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&#039;mag viele Leerzeichen&#039;: true};&lt;br /&gt;
console.log(person1[&#039;mag viele Leerzeichen&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1.adresse);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften&lt;br /&gt;
sowohl mittels Punktnotation als auch mittels String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {alter: 5};&lt;br /&gt;
person1.alter += 5;&lt;br /&gt;
person1[&#039;alter&#039;] += 5;&lt;br /&gt;
console.log(person1.alter);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim schreibenden Zugriff auf eine nicht existierende Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Dies bedeutet dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.alter = 42;&lt;br /&gt;
person1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
person1.hatBrille = true;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen von Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop in Kombination mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
for (var eigenschaft in person1) {&lt;br /&gt;
  if (person1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + person1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mir listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = new Array(10);&lt;br /&gt;
console.log(personenregister.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaft hat allerdings keine Auswirkung auf das tatsächliche Speichervermögen eines Arrays.&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte mit unterschiedlichen Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}, &#039;fehlerhafter Datensatz];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToe = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenregister[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
personenregister[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenreigster = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
personenreigster[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
personenregister.length = 10;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.push(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var person1 = personenregister.pop();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.unshift(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/)&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; personenregister.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + personenregister[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen. &lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu dass eine Variable mit demselben Namen der Funktion definiert wird welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt!&#039;);&lt;br /&gt;
}&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter die Funktionsdeklaration vor der &lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Sag Hallo&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann einem einer Variable zugewiesenen Funktionsausdruck auch eine Funktionsname gegeben werden.&lt;br /&gt;
Dieser kann von dem Funktionskörper selbst verwendet werden um die Funktion zu referenzieren, z.B. bei Rekursion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zeichneAlles = function zeichneNaechstesObjekt() {&lt;br /&gt;
  // ...&lt;br /&gt;
  zeichneNaechstesObjekt();&lt;br /&gt;
}&lt;br /&gt;
zeichneAlles();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Persönlich hatte ich noch nie Verwendung dafür.&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
var name = kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {}&lt;br /&gt;
console.log(addiere.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sindArgumenteGegeben = function() {&lt;br /&gt;
  if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(sindArgumenteGegeben());&lt;br /&gt;
console.log(sindArgumenteGegeben(1)));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(anonymer) Funktionsausdruck==&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise nützlich wenn es darum geht &lt;br /&gt;
Funktionen als Argumente zu übergeben oder als Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleFunktion = function() {&lt;br /&gt;
  return function() {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(erstelleFunktion());&lt;br /&gt;
console.log(erstelleFunktion() == erstelleFunktion());&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sucheErstesLeerzeichen = function(eingabe) {&lt;br /&gt;
  var index = 0;&lt;br /&gt;
  for (var index = 0; index &amp;lt; eingabe.length; i++) {&lt;br /&gt;
    if (eingabe.charAt(index) == &#039; &#039;) {&lt;br /&gt;
      index =  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return zaehler;&lt;br /&gt;
}&lt;br /&gt;
console.log(f2());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleName = function() {&lt;br /&gt;
  var erstelleVorname = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstelleNachname = function() {&lt;br /&gt;
    return &#039;Mustermann&#039;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return erstelleVorname() + &#039; &#039; + erstelleNachname();&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var substrahiere = function(a, b) {&lt;br /&gt;
  return addiere(a, -b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var multipliziere = function(a, b) {&lt;br /&gt;
  return a * b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var dividiere = function(a, b) {&lt;br /&gt;
  return a / b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
taschenrechner.substrahiere = substrahiere;&lt;br /&gt;
taschenrechner.multipliziere = multipliziere;&lt;br /&gt;
taschenrechner.dividiere = dividiere;&lt;br /&gt;
&lt;br /&gt;
taschenrechner.teileGanzzahl = function() {&lt;br /&gt;
  return Math.flor(dividiere(a, b));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38224</id>
		<title>JavaScript-Tutorium:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Grundlagen&amp;diff=38224"/>
		<updated>2015-10-01T20:45:48Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Überblick */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten der Sprache JavaScript zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Geschichtliches==&lt;br /&gt;
&lt;br /&gt;
* Erfunden von Brendan Eich bei Netscape&lt;br /&gt;
* Adaptiert von Microsoft und JScript benannt&lt;br /&gt;
* Netscape und Microsoft entwickeln unterschiedliche Implementierung&lt;br /&gt;
* Überreicht von Netscape an ECMA und standardisiert als ECMAScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spracheigenschaften==&lt;br /&gt;
&lt;br /&gt;
* Syntax ist an C angelehnt&lt;br /&gt;
* Hat fast nichts zu tun mit Java&lt;br /&gt;
* Ist interpretiert, nicht kompiliert&lt;br /&gt;
* Looses Typsystem&lt;br /&gt;
* Objektorientiert, nicht klassorientiert&lt;br /&gt;
* Begünstigt funktionales Programmieren&lt;br /&gt;
* Läuft in vielen unterschiedlichen Umgebungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umgebungen==&lt;br /&gt;
&lt;br /&gt;
* Browser, z.B. Firefox, Chrome, Internet Explorer, Safari, Opera&lt;br /&gt;
* Server, z.B. NodeJS, Windows Scripting Host, Rhino&lt;br /&gt;
* Applikationen, z.B. Adobe Photoshop, Quartz Composer&lt;br /&gt;
* Betriebssysteme, z.B. GNOME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Engines==&lt;br /&gt;
&lt;br /&gt;
* SpiderMonkey/JägerMonkey: Firefox, GNOME&lt;br /&gt;
* V8: Chrome, NodeJS&lt;br /&gt;
* Trident/Chakra: Internet Explorer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ECMAScript Versionen==&lt;br /&gt;
&lt;br /&gt;
* ES3 ist vollständig implementiert von allen gängigen Browsern&lt;br /&gt;
* ES5 ist vollständig implementiert von IE9+, FF4+, Chrome7+&lt;br /&gt;
* ES.next/Harmony ist von keinem Browser vollständig implementiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Literaturempfehlungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;JavaScript: The Good Parts&amp;quot; - Douglas Crockford&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/JavaScript Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
=Schlüsselwörter=&lt;br /&gt;
&lt;br /&gt;
Folgende Wörter sind für die Sprache selbst reserviert und können nicht als Variablennamen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
abstract  &lt;br /&gt;
boolean break byte  &lt;br /&gt;
case catch char class const continue  &lt;br /&gt;
debugger default delete do double  &lt;br /&gt;
else enum export extends  &lt;br /&gt;
false final finally float for function  &lt;br /&gt;
goto  &lt;br /&gt;
if implements import in instanceof int interface  &lt;br /&gt;
long  &lt;br /&gt;
native new null  &lt;br /&gt;
package private protected public  &lt;br /&gt;
return  &lt;br /&gt;
short static super switch synchronized  &lt;br /&gt;
this throw throws transient true try typeof  &lt;br /&gt;
var volatile void  &lt;br /&gt;
while with&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Die Auswahl der Begriffe orientierte sich stark an der Sprache Java.&lt;br /&gt;
Einige der Begriffe finden in JavaScript aktuell keine Verwendung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
&lt;br /&gt;
In JavaScript wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; verwendet um Variablen zu deklarieren (und zu initialisieren).&lt;br /&gt;
&lt;br /&gt;
==Definition und Zuweisung==&lt;br /&gt;
&lt;br /&gt;
Variablen können unmittelbar bei der Deklaration definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tageProWoche = 7;&lt;br /&gt;
console.log(tageProWoche);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch zu späteren Zeitpunkten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tageProWoche;&lt;br /&gt;
tageProWoche = 7;&lt;br /&gt;
console.log(tageProWoche);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Typabgabe ist nicht notwendig da es sich nicht um eine stark typisierte Sprachen handelt.&lt;br /&gt;
Die Engine kümmert sich automatisch um die Anforderung und Freigabe von Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var pruefungBestanden = 1;&lt;br /&gt;
pruefungBestanden = true;&lt;br /&gt;
console.log(pruefungBestanden);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie auch in anderen Sprachen sind Mehrfachzuweisungen erlaubt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tick, trick, track;&lt;br /&gt;
tick = trick = track = &#039;Ente&#039;;&lt;br /&gt;
console.log(tick);&lt;br /&gt;
console.log(trick);&lt;br /&gt;
console.log(track);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine erneute Deklaration einer bereits bestehenden Variable führt zu keinem Fehler, sollte allerdings vermieden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var doppeltDeklariert = false;&lt;br /&gt;
var doppeltDeklariert = true;&lt;br /&gt;
console.log(doppeltDeklariert);    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hoisting==&lt;br /&gt;
&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter alle Variablendefinitionen vor der eigentlichen Ausführung &lt;br /&gt;
des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt. &lt;br /&gt;
Dies betrifft ausschließlich die Definitionen, nicht aber die initiale Belegung mit einem Wert.&lt;br /&gt;
&lt;br /&gt;
Augenscheinlich kann man dadurch Code schreiben der Variablen verwendet bevor sie überhaupt definiert sind.&lt;br /&gt;
Da jedoch die initiale Wertzuweisung nicht vom Interpreter verschoben wird kann dies zu unerwarteten Resultaten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(nochNichtDeklariert);&lt;br /&gt;
var nochNichtDeklariert = 5;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um Hoisting weitesgehend zu vermeiden ist es empfehlenswert alle Variablendeklaration immer am Anfang der &lt;br /&gt;
jewilig umgebenden Funktion zu schreiben. Handelt es sich um globale Variable sollten diese am Anfang der JavaScript-Datei stehen.&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen==&lt;br /&gt;
&lt;br /&gt;
In der Regel besitzt eine JavaScript-Umgebung ein globales Objekt, welches alle globalen Properties beherbergt.&lt;br /&gt;
Im Browser wird das globale Objekt über die Variable &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; verfügbar gemacht. In Node.JS heisst es &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;.&lt;br /&gt;
Falls eine Variable nicht innerhalb einer Funktion definiert wird, wird diese automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = new Object();&lt;br /&gt;
console.log(&#039;ist person1 global?&#039;, person1 === window.person1);&lt;br /&gt;
var erstellePerson2 = function() {&lt;br /&gt;
  var person2 = new Object();&lt;br /&gt;
  console.log(&#039;is person2 global?&#039;, person2 === window.person2);&lt;br /&gt;
}&lt;br /&gt;
erstellePerson2();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird das Schlüsselwort &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; vergessen, wird die Variable implizit als globale Variable definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleGlobaleVariable = function() {&lt;br /&gt;
  globaleVariable = 1;&lt;br /&gt;
}&lt;br /&gt;
erstelleGlobaleVariable();&lt;br /&gt;
console.log(globaleVariable);&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Primitive Datentypen=&lt;br /&gt;
&lt;br /&gt;
JavaScript stellt folgende primitive Datentypen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Null, Undefined, Number, Boolean, String&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Number, Boolean und String auch als Objekte behandelt mittels des sogenannten Boxings.&lt;br /&gt;
&lt;br /&gt;
==Null==&lt;br /&gt;
&lt;br /&gt;
Null ist ein Datentyp der nur einen definierten Wert annehmen kann: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
Anders als in anderen Sprachen ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; nicht der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var referenz = null;&lt;br /&gt;
console.log(referenz);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Undefined==&lt;br /&gt;
&lt;br /&gt;
Undefined ist ein Datentyp der ebenso nur einen definerten Wert annehmen kann: &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt;.&lt;br /&gt;
Undefined ist der Standardwert einer nicht initialisierten Variable.&lt;br /&gt;
Er ist &#039;&#039;&#039;nicht&#039;&#039;&#039; gleichbedeutend mit &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var referenz1, referenz2 = null;&lt;br /&gt;
console.log(referenz1);&lt;br /&gt;
console.log(referenz1 === referenz2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Die JavaScript-Umgebung stellt eine Variable &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zur Verfügung welche den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; enthält.&lt;br /&gt;
Unglücklicherweise kann diese Variable in manchen JavaScript-Umgebung neu definiert werden.&lt;br /&gt;
&lt;br /&gt;
==Boolean==&lt;br /&gt;
&lt;br /&gt;
Boolean ist ein boolscher Datentyp welcher die Werte &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; annehmen kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var istGrasGruen = true, sindBananenBlau = false;&lt;br /&gt;
console.log(istGrasGruen);&lt;br /&gt;
console.log(sindBananenBlau);&lt;br /&gt;
console.log(istGrasGruen === sindBananenBlau);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Number==&lt;br /&gt;
&lt;br /&gt;
Number ist eine 64 bit breite Fließkommazahl, ähnlich zu &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; wie in Java.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var monateProJahr = 12, pi = 3.14;&lt;br /&gt;
console.log(monateProJahr);&lt;br /&gt;
console.log(pi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JavaScript besitzt keinen separaten Datentyp für Integer-Zahlen.&lt;br /&gt;
Integer-Werte werden auch als Number abgebildet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ganzzahl = 1, gleitkomma = 1.0000;&lt;br /&gt;
console.log(ganzzahl === gleitkomma);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es existieren die gängigen arithmetischen Operatoren für Berechnungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(1 + 2);&lt;br /&gt;
console.log(1 - 2);&lt;br /&gt;
console.log(1 * 2);&lt;br /&gt;
console.log(1 / 2);&lt;br /&gt;
&lt;br /&gt;
console.log(--1);&lt;br /&gt;
console.log(++1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
Da es sich bei jeder Zahl um eine Fließkommazahl handelt gibt es keine ganzzahlige Teilung.&lt;br /&gt;
Diese muss über einen Umweg mithilfe der Number API emuliert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quotient = Math.floor(5 / 3);&lt;br /&gt;
console.log(quotient);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Wert NaN (not a number) ist das Ergebnis einer mathematischen Operation die nicht in einer Zahl resultiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ungueltigeOperation = 100 / &#039;a&#039;;&lt;br /&gt;
console.log(ungueltigeOperation);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zahlen vom Typ Number können auch in oktaler und hexadezimaler Form geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var oktal = 017, hexadezimal = 0x10;&lt;br /&gt;
console.log(oktal);&lt;br /&gt;
console.log(hexadezimal);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Number API===&lt;br /&gt;
&lt;br /&gt;
Der Datentyp Number stellt diverse Hilfsfunktionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Number.MAX_VALUE);&lt;br /&gt;
console.log(Number.MIN_VALUE);&lt;br /&gt;
&lt;br /&gt;
var zahl = 2;&lt;br /&gt;
console.log(zahl.toFixed(3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/) MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
==String==&lt;br /&gt;
&lt;br /&gt;
Der Datentyp String wird verwendet um unveränderliche Folgen von 16 bit breiten Zeichen darzustellen.&lt;br /&gt;
Anders als in anderen Sprachen existiert kein Datentyp für einzelne Zeichen.&lt;br /&gt;
&lt;br /&gt;
Strings können sowohl von einfachen als auch von doppelten Anführungszeichen umgeben sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name1 = &#039;Paul&#039;, name2 = &#039;Peter&#039;;&lt;br /&gt;
console.log(name1);&lt;br /&gt;
console.log(name2);&lt;br /&gt;
console.log(name1 === name2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Anführungszeichen selbst in Strings zu verwenden müssen diese mit vorangestellten Backslash versehen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;\&#039;&#039;);&lt;br /&gt;
console.log(&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Strings können mithilfe des Plus-Operators zu einem neuen String zusammengesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Max&#039; + &#039; &#039; + &#039;Mustermann&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===String API===&lt;br /&gt;
&lt;br /&gt;
Ebenso wie der Datentyp Number stellt String unterschiedliche Hilfsfunktionen zur Verfügung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = &#039;Max Mustermann&#039;;&lt;br /&gt;
console.log(&#039;Name hat eine Länge von &#039; + name.length);&lt;br /&gt;
console.log(&#039;Name als Großbuchstaben: &#039; + name.toUpperCase());&lt;br /&gt;
console.log(&#039;Name als Kleinbuchstaben: &#039; + name.toLowerCase());&lt;br /&gt;
console.log(&#039;Name erstes &amp;quot;e&amp;quot; ist an Position &#039; + name.indexOf(&#039;e&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der String API finden sie auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/) MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vergleiche=&lt;br /&gt;
&lt;br /&gt;
==Gleichheit (==)==&lt;br /&gt;
&lt;br /&gt;
Der Gleichheitsoperator konvertiert Datentypen der beiden zu vergleichenden Ausdrücke und vergleicht dann die Werte.&lt;br /&gt;
Der Ungleichheitsoperator verhält sich analog.&lt;br /&gt;
&lt;br /&gt;
Die Umwandlung bei Typungleichheit richtet sich nach den folgenden fünf Regeln:&lt;br /&gt;
&lt;br /&gt;
  1. &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; sind gleich&lt;br /&gt;
  2. Strings werden in Zahlen konvertiert wenn sie mit Zahlen verglichen werden&lt;br /&gt;
  3. Boolsche Werte werden in Zahlen konvertiert&lt;br /&gt;
  4. Objekte werden konvertiert mittles valueOf() wenn Sie mit Number vergleichen werden &lt;br /&gt;
  5. Objekte werden konvertiert mittels toString() wenn Sie mit String vergleichen werden &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null == undefined);&lt;br /&gt;
console.log(&#039;3&#039; == 3);&lt;br /&gt;
console.log(true == 1);&lt;br /&gt;
console.log(new Object() == &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Regeln gelten lediglich für die Typumwandlung. Es ist trotzdem ohne weiteres möglich&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Gleichheitsoperator zu verwenden um zum Beispiel Objektreferenzen zu vergleichen.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {}, person2 = {};&lt;br /&gt;
console.log(person1 == person1);&lt;br /&gt;
console.log(person1 == person2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Identität==&lt;br /&gt;
&lt;br /&gt;
Der Identitätsoperator vergleicht zuerst die Datentypen und bei Typgleichheit die Werte zweier Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(null === undefined);&lt;br /&gt;
console.log(&#039;3&#039; === 3);&lt;br /&gt;
console.log(true === 1);&lt;br /&gt;
console.log(new Object() === &#039;[object Object]&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Verwendung des Gleichheitsoperators wird in großen Teilen der JavaScript-Gemeinde als&lt;br /&gt;
schlechte Programmierpraxis angesehen. Oftmals wird ausschließlich der Identitätsoperator verwendet.&lt;br /&gt;
&lt;br /&gt;
==Größer und kleiner==&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperatoren größer (gleich) und kleiner (gleich) arbeiten auf die gleiche Weise wie der Gleichheitsoperator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(2 &amp;gt; &#039;1&#039;);&lt;br /&gt;
console.log(true &amp;gt; 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisung=&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die Syntax der if-Anweisung ist identisch zu den meisten anderen Sprachen.&lt;br /&gt;
Es gilt aber zu beachten dass folgende Ausdrücke als &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; interpretiert werden:&lt;br /&gt;
false, null, undefined, &#039;&#039;, 0, NaN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (!false) {&lt;br /&gt;
  console.log(&#039;!false ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!null) {&lt;br /&gt;
  console.log(&#039;!null ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist null nicht gleich false: &#039; + (null == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!undefined) {&lt;br /&gt;
  console.log(&#039;!undefined ergibt true&#039;);&lt;br /&gt;
  console.log(&#039;allerdings ist undefined nicht gleich false: &#039; + (undefined == false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!&#039;&#039;) {&lt;br /&gt;
  console.log(&#039;!&amp;quot;&amp;quot; ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!NaN) {&lt;br /&gt;
  console.log(&#039;!NaN ergibt true&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Boolsche Logik===&lt;br /&gt;
&lt;br /&gt;
Die Boolsche Logik funktioniert ebenfalls wie in anderen Sprachen, inklusive Short-Circuit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (false || null || undefined || &#039;&#039; || NaN || true) {&lt;br /&gt;
  console.log(false || null || undefined || &amp;quot;&amp;quot; || NaN || true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var nichtVeraenderteVariable = 1;&lt;br /&gt;
if (false &amp;amp;&amp;amp; nichtVeraenderteVariable++) {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
console.log(nichtVeraenderteVariable);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der ternäre Operator interpretiert die gleichen Werte wie das if-Statement als false:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(true ? 1 : 0);&lt;br /&gt;
console.log(null ? 1 : 0);&lt;br /&gt;
console.log(null != false ? 1 : 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisung vergleicht einen gegebenen Ausdruck mit einer Liste von Werten (per Identität).&lt;br /&gt;
Stimmt die Identität eines Wertes mit dem Ausdruck überein so wird der nachfolgend stehende Code ausgeführt.&lt;br /&gt;
Eine &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;-Anweisung beendet in solch einem Fall die Code-Ausführung frühzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var countdown = 3;&lt;br /&gt;
switch (countdown) {&lt;br /&gt;
  case 3:&lt;br /&gt;
    console.log(&#039;3&#039;);&lt;br /&gt;
  case 2:&lt;br /&gt;
    console.log(&#039;2&#039;);&lt;br /&gt;
  case 1:&lt;br /&gt;
    console.log(&#039;1&#039;);&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    console.log(&#039;0&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==while- und do-while-Schleifen==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife führt ein Stück Code so lange wie aus wie ein gegebener Ausdruck den Wert &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ergibt.&lt;br /&gt;
Ergibt der Ausdruck beim ersten Mal bereits nicht &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; so wird der gegebene Code nie ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehler = 10;&lt;br /&gt;
while (zaehler--) {&lt;br /&gt;
  console.log(zaehler);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (false) {&lt;br /&gt;
  console.log(&#039;wird nicht ausgegeben&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife funktioniert genauso wie die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife mit der Ausnahme dass der gegebene auf jeden&lt;br /&gt;
Fall einmal ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  console.log(&#039;wird ausgegeben&#039;);&lt;br /&gt;
} while (false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==try, catch und throw==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; werden verwendet um Exceptions abzufangen und zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  console.log(objekt.eigenschaft.eigenschaft);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; wird verwendet um Exceptions zu werfen. Als Argument sollte ein &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;-Objekt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  throw new Error(&#039;Custom error&#039;);&lt;br /&gt;
}&lt;br /&gt;
catch (error) {&lt;br /&gt;
  console.log(error);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==for- und for-in-Schleifen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleifen funktionieren ebenfalls wie in den meisten anderen Sprachen.&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;-Loop wird verwendet um über Eigenschaften eines Objekts zu iterieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt; sollte in der Regel mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var spieler = {name: &#039;Max Mustermann&#039;, leben: 3, punkte: 2000};&lt;br /&gt;
for (var eigenschaft in spieler) {&lt;br /&gt;
  console.log(spieler[eigenschaft]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Objekte=&lt;br /&gt;
&lt;br /&gt;
Jeder Wert mit einem anderen Datentypen als ein primitiver Datentyp ist ein Objekt.&lt;br /&gt;
JavaScript bietet eingebaute/native Objekte wie Funktionen, Arrays, reguläre Ausdrücke, Daten und generische Objekte.&lt;br /&gt;
Objekte sind veränderliche Sammlungen von Eigenschaften. &lt;br /&gt;
Eine Eigenschaft ist ein Schlüssel-Wert-Paar, wobei der Schlüssel ein String und der Wert von beliebigem Typ ist.&lt;br /&gt;
Objekte sind vergleichbar mit Hash-Maps und/oder Dictionaries.&lt;br /&gt;
&lt;br /&gt;
Variablen speichern immer die Referenz zu Objekten, nicht die Objekte selbst.&lt;br /&gt;
&lt;br /&gt;
==Erstellung von Objekten==&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art ein Objekt zu erstellen ist mittels des Objektliterals &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist der Objekt-Konstruktor, welche allerdings keine Vorteile gegenüber dem Literal bietet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = new Object();&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objekte können bei ihrer Erstellung mit Eigenschaften und Werten vorbelegt werden.&lt;br /&gt;
Die Eigenschaften werden als kommaseparierte Liste angegeben.&lt;br /&gt;
Eigenschaft und Wert werden jeweils durch einen Doppelpunkt getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften müssen in Anführungszeichen angegeben werden falls es sich um reservierte Wörter handelt&lt;br /&gt;
oder der Name der Eigenschaft Zeichen enthält die nicht bei Variablennamen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bier = {&#039;export&#039;: true, &#039;ist alkoholfrei&#039;: false};&lt;br /&gt;
console.log(bier);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können sowohl mit Werten primitiver Datentypen als auch mit Objekten und Funktionen belegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  getName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.getName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten um auf die Eigenschaften eines Objekts zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann die Punktnotation verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum anderen ist es möglich eines String-Ausdruck in eckigen Klammern anzugeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
console.log(person1[&#039;person1&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Regel wird die erste Variante verwendet wenn der Name der Eigenschaft bekannt und statisch ist.&lt;br /&gt;
Die zweite Variante wird vor allem verwendet wenn der Eigenschaftsname dynamisch zur Laufzeit bestimmt wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {vorname: &#039;Max&#039;, nachname: &#039;Mustermann&#039;};&lt;br /&gt;
var hatObjektEigenschaft = function(objekt, eigenschaft) {&lt;br /&gt;
  return objekt[eigenschaft] ? true : false;&lt;br /&gt;
}&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;vorname&#039;);&lt;br /&gt;
console.log(hatObjektEigenschaft(person1, &#039;nachname&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der initialen Befüllung muss auch ein String-Ausdruck verwendet werden wenn es sich bei dem Namen&lt;br /&gt;
der Eigenschaft um ein reserviertes Schlüsselwort handelt oder aber unerlaubte Zeichen für Variablennamen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&#039;mag viele Leerzeichen&#039;: true};&lt;br /&gt;
console.log(person1[&#039;mag viele Leerzeichen&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf eine nicht definierte Eigenschaft eines Objekts liefert den Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
console.log(person1.adresse);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Analog zum Lesen können Werte von Eigenschaften&lt;br /&gt;
sowohl mittels Punktnotation als auch mittels String-Ausdruck verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {alter: 5};&lt;br /&gt;
person1.alter += 5;&lt;br /&gt;
person1[&#039;alter&#039;] += 5;&lt;br /&gt;
console.log(person1.alter);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim schreibenden Zugriff auf eine nicht existierende Eigenschaft eines Objekts wird diese implizit definiert.&lt;br /&gt;
Dies bedeutet dass jedem Objekt dynamisch zur Laufzeit jederzeit beliebige Eigenschaften zugewiesen werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.alter = 42;&lt;br /&gt;
person1.name = &#039;Rainer Zufall&#039;;&lt;br /&gt;
person1.hatBrille = true;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen von Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Um alle Eigenschaften eines Objekts abzufragen wird der &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Loop in Kombination mit &amp;lt;code&amp;gt;hasOwnProperty()&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;, alter: 42, hatBrille: true};&lt;br /&gt;
for (var eigenschaft in person1) {&lt;br /&gt;
  if (person1.hasOwnProperty(eigenschaft)) {&lt;br /&gt;
    console.log(eigenschaft + &#039;: &#039; + person1[eigenschaft]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften können mittels dem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; Operator von Objekten entfernt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {hatBrille: true};&lt;br /&gt;
delete person1.hatBrille;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Den Wert einer Eigenschaft auf &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zu setzen ist nicht mit einem &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gleichzusetzen.&lt;br /&gt;
Die Zuweisung von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; lässt die Eigenschaft auf dem Objekt bestehen, z.B. relevant für &amp;lt;code&amp;gt;for in&amp;lt;/code&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Arrays=&lt;br /&gt;
&lt;br /&gt;
In JavaScript sind Arrays genau genommen Objekte mir listenähnlichem Verhalten.&lt;br /&gt;
Im Gegensatz zu anderen Sprachen besitzen sie eine dynamische Länge.&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
Analog zur Objekterstellung ist der einfachste Weg ein Array zu erstellen mittels des Literals &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man ebenfalls einen Konstruktor verwenden und die &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; Eigenschaft initial definieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = new Array(10);&lt;br /&gt;
console.log(personenregister.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaft hat allerdings keine Auswirkung auf das tatsächliche Speichervermögen eines Arrays.&lt;br /&gt;
&lt;br /&gt;
Arrays können ebenso initial mit Werten vorbefüllt werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{}, {}, {}, {}, {}];&lt;br /&gt;
console.log(a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da JavaScript generell nicht stark typisiert ist können Arrays Werte mit unterschiedlichen Typen enthalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {vorname: &#039;John&#039;, nachname: &#039;Doe&#039;}, &#039;fehlerhafter Datensatz];&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die bereits erwähnte Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; beschreibt die aktuelle Anzahl an Werten im Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;array has a length of &#039; + [1, 2, 3, 4, 5].length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multidimensionale Arrays können ebenfalls mit Literalen erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var ticTacToe = [&lt;br /&gt;
  [&#039;O&#039;, &#039;O&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;X&#039;],&lt;br /&gt;
  [&#039;O&#039;, &#039;X&#039;, &#039;O&#039;]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lesen von Werten==&lt;br /&gt;
&lt;br /&gt;
Werte von Arrays können über den numerischen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenregister[0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreiben von Werten==&lt;br /&gt;
&lt;br /&gt;
Ebenso können Werte direkt über den Zugriff auf den Index verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{vorname: &#039;Mäxle&#039;, nachname: &#039;Mustermann&#039;}];&lt;br /&gt;
personenregister[0].vorname = &#039;Max&#039;;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird auf einen noch nicht belegten Index zugegriffen, wird das Array entsprechend erweitert.&lt;br /&gt;
Bisher nicht belegte Stellen werden mit dem Wert &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; belegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenreigster = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
personenreigster[5] = {name: &#039;Frau Holle&#039;};&lt;br /&gt;
console.log(personenreigster);&lt;br /&gt;
console.log(personenreigster.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veränderungen der Eigenschaft &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; legen die aktuelle Größe eines Arrays fest unabhängig vom Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
personenregister.length = 10;&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Werte ans Ende des Arrays einzufügen wird die &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.push(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;-Funktion entfernt hingegen das aktuell letzte Element eines Arrays und verringert dessen Größe um 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}];&lt;br /&gt;
var person1 = personenregister.pop();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktionen &amp;lt;code&amp;gt;unshift()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shift()&amp;lt;/code&amp;gt; funktionieren wie &amp;lt;code&amp;gt;push()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;, jedoch für den Anfang eines Arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [];&lt;br /&gt;
var person1 = {name: &#039;Max Mustermann&#039;};&lt;br /&gt;
personenregister.unshift(person1);&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
personenregister.shift();&lt;br /&gt;
console.log(personenregister);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Arrays miteinander zu kombinieren wird die &amp;lt;code&amp;gt;concat()&amp;lt;/code&amp;gt;-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log([1, 2].concat([3, 4]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Referenz der Array API ist auf&lt;br /&gt;
[dieser](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/)&lt;br /&gt;
MDN-Seite zu finden.&lt;br /&gt;
&lt;br /&gt;
==Enumerierung==&lt;br /&gt;
&lt;br /&gt;
Um alle Elemente eines Arrays abzufragen wird der &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Loop  verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var personenregister = [{name: &#039;Max Mustermann&#039;}, {name: &#039;John Doe&#039;}];&lt;br /&gt;
for (var index = 0; index &amp;lt; personenregister.length; index++) {&lt;br /&gt;
    console.log(index + &#039;: &#039; + personenregister[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Objekte in JavaScript. Das bedeutet sie haben Eigenschaften und können Variablen zugewiesen werden.&lt;br /&gt;
Eine Funktion besteht aus dem Schlüsselwort &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt;, einem Namen, einer Liste von Argumenten und einem Funktionskörper.&lt;br /&gt;
&lt;br /&gt;
==Ausführung und Erstellung==&lt;br /&gt;
&lt;br /&gt;
Funktionen werden ausgeführt indem man sie mit ihrem Namen aufruft und eine Liste an Argumenten übergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;Hello World&#039;);&lt;br /&gt;
var maximum = Math.max(42, 23);&lt;br /&gt;
console.log(maximum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten Funktionen zu erstellen. &lt;br /&gt;
Zum einen kann eine sogenannte Funktionsdeklaration verwendet werden.&lt;br /&gt;
Diese führt dazu dass eine Variable mit demselben Namen der Funktion definiert wird welche auf die Funktion zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt!&#039;);&lt;br /&gt;
}&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsdeklaration unterliegen dem sogenannten Hoisting.&lt;br /&gt;
Hoisting bedeutet dass der JavaScript-Interpreter die Funktionsdeklaration vor der &lt;br /&gt;
eigentlichen Ausführung des Codes innerhalb der umgebenden Funktion nach oben an den Anfang schiebt.&lt;br /&gt;
&lt;br /&gt;
Das heisst man kann Code schreiben in dem eine Funktion augenscheinlich aufgerufen wird bevor sie definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
function sagHallo() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Möglichkeit eine Funktion zu erstellen besteht darin einen Funktionsausdruck einer Variable zuzuweisen.&lt;br /&gt;
Der Funktionsausdruck sieht dabei der Deklaration sehr ähnlich, außer dass in der Regel kein Funktionsname vergeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
sagHallo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionsausdrücke werden besonders dann bevorzugt wenn man die negativen Effekte des Hoisting minimieren möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sagHallo();&lt;br /&gt;
var sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Sag Hallo&#039;);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann einem einer Variable zugewiesenen Funktionsausdruck auch eine Funktionsname gegeben werden.&lt;br /&gt;
Dieser kann von dem Funktionskörper selbst verwendet werden um die Funktion zu referenzieren, z.B. bei Rekursion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zeichneAlles = function zeichneNaechstesObjekt() {&lt;br /&gt;
  // ...&lt;br /&gt;
  zeichneNaechstesObjekt();&lt;br /&gt;
}&lt;br /&gt;
zeichneAlles();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Persönlich hatte ich noch nie Verwendung dafür.&lt;br /&gt;
&lt;br /&gt;
==Argumente==&lt;br /&gt;
&lt;br /&gt;
Funktionsargumente werden definiert als kommaseparierte Liste und werden bei der Ausführung auch als solche übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
var name = kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jede Funktion in JavaScript kann mit einer beliebigen Anzahl an Argumenten aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kombiniere = function(string1, string2) {&lt;br /&gt;
  return string1 + &#039; &#039; + string2;&lt;br /&gt;
}&lt;br /&gt;
console.log(kombiniere());&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;));&lt;br /&gt;
console.log(kombiniere(&#039;Max&#039;, &#039;Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen verfügen über eine lokale Variable namens &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt;.&lt;br /&gt;
Diese ist ein Array-artiges Objekt und enthält alle Argumente die beim Aufruf übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var zaehleArgumente = function() {&lt;br /&gt;
  return arguments.length;&lt;br /&gt;
}&lt;br /&gt;
console.log(zaehleArgumente(1));&lt;br /&gt;
console.log(zaehleArgumente(1, 2, 3));&lt;br /&gt;
console.log(zaehleArgumente(true, null, undefined));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem besitzen Funktionen eine Eigenschaft namens &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; welche die Anzahl an erwarteten Argumenten beschreibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {}&lt;br /&gt;
console.log(addiere.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rückgabewert==&lt;br /&gt;
&lt;br /&gt;
Funktionen in JavaScript können beliebige Werte zurückgeben.&lt;br /&gt;
Ist kein expliziter Rückgabewert vorhanden gibt eine Funktion implizit &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var gibNichtsZurück = function() {&lt;br /&gt;
}&lt;br /&gt;
console.log(gibNichtsZurück());&lt;br /&gt;
var gibEinsZurück = function() {&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
console.log(gibEinsZurück());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ein impliziter Rückgabewert von &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; ist nicht gegeben wenn eine Funktion mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Es kann sogar zur Laufzeit entschieden werden ob ein Wert zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sindArgumenteGegeben = function() {&lt;br /&gt;
  if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
console.log(sindArgumenteGegeben());&lt;br /&gt;
console.log(sindArgumenteGegeben(1)));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(anonymer) Funktionsausdruck==&lt;br /&gt;
&lt;br /&gt;
(Anonyme) Funktionsausdrücke sind aufgrund ihrer kompakten Schreibweise nützlich wenn es darum geht &lt;br /&gt;
Funktionen als Argumente zu übergeben oder als Rückgabewerte zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleFunktion = function() {&lt;br /&gt;
  return function() {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(erstelleFunktion());&lt;br /&gt;
console.log(erstelleFunktion() == erstelleFunktion());&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scope==&lt;br /&gt;
&lt;br /&gt;
Der Scope kontrolliert die Sichtbarkeit und Lebensdauer von Variablen und Argumenten.&lt;br /&gt;
Anders als in anderen Sprachen besitzt JavaScript einen funktionsbasierten Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var sucheErstesLeerzeichen = function(eingabe) {&lt;br /&gt;
  var index = 0;&lt;br /&gt;
  for (var index = 0; index &amp;lt; eingabe.length; i++) {&lt;br /&gt;
    if (eingabe.charAt(index) == &#039; &#039;) {&lt;br /&gt;
      index =  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return zaehler;&lt;br /&gt;
}&lt;br /&gt;
console.log(f2());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In neueren ECMAScript-Versionen ist es möglich mithilfe des Schlüsselworts&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;let&amp;lt;/code&amp;gt; Variablen mit Block-Scope zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
==Innere Funktionen==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt sind Funktionen Objekte und können auch Variablen zugewiesen werden.&lt;br /&gt;
Deswegen kann eine Funktion in ihrem Funktionskörper auch weitere lokale Funktion erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstelleName = function() {&lt;br /&gt;
  var erstelleVorname = function() {&lt;br /&gt;
    return &#039;Max&#039;;&lt;br /&gt;
  };&lt;br /&gt;
  var erstelleNachname = function() {&lt;br /&gt;
    return &#039;Mustermann&#039;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return erstelleVorname() + &#039; &#039; + erstelleNachname();&lt;br /&gt;
};&lt;br /&gt;
console.log(erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Objektfunktionen==&lt;br /&gt;
&lt;br /&gt;
Funktionen können ebenso Variablen und somit auch Objekteigenschaften zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
console.log(person1);&lt;br /&gt;
console.log(person1.erstelleName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst nach Erstellung eines Objekts können Funktion als Eigenschaften referenziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var substrahiere = function(a, b) {&lt;br /&gt;
  return addiere(a, -b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var multipliziere = function(a, b) {&lt;br /&gt;
  return a * b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var dividiere = function(a, b) {&lt;br /&gt;
  return a / b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var taschenrechner = {memory: 42, batterie: 0.8};&lt;br /&gt;
&lt;br /&gt;
taschenrechner.addiere = addiere;&lt;br /&gt;
taschenrechner.substrahiere = substrahiere;&lt;br /&gt;
taschenrechner.multipliziere = multipliziere;&lt;br /&gt;
taschenrechner.dividiere = dividiere;&lt;br /&gt;
&lt;br /&gt;
taschenrechner.teileGanzzahl = function() {&lt;br /&gt;
  return Math.flor(dividiere(a, b));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(taschenrechner.addiere(taschenrechner.memory, 23));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Konstruktoren=&lt;br /&gt;
&lt;br /&gt;
JavaScript ist eine objektorientierte Sprache, bestitzt aber keine Klassen im Gegensatz zu klassienbasierten Sprachen.&lt;br /&gt;
Eine von mehreren Möglichkeiten Objekte mit ähnlichem Verhalten und ähnlicher Struktur zu erstellen sind Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
Jenseits der normalen Ausführung kann &#039;&#039;&#039;jede&#039;&#039;&#039; Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
Dies ergibt allerdings nur dann Sinn wenn die Funktion auch als Konstruktorfunktion gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var addiere = function(a, b) {&lt;br /&gt;
  return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(addiere(4, 3));&lt;br /&gt;
console.log(new addiere(4, 3));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es nicht sinnvoll als Konstruktoren gedachte Funktionen ohne das Schlüsselwort &amp;quot;new&amp;quot; aufzurufen.&lt;br /&gt;
Dies kann zu unerwarteten Seiteneffekten führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(Person());&lt;br /&gt;
console.log(new Person());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen die als Konstruktoren dienen sollten mit einem Großbuchstaben beginnen um sie deutlich erkennbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
console.log(person()); // ?&lt;br /&gt;
console.log(new person()); // ?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird,&lt;br /&gt;
wird ein automatisch erzeugtes Objekt am Ende der Funktion zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
person1.name = &#039;John Doe&#039;;&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird hingegen ein Rückgabewert vom Konstruktor definiert überschreibt dieser den automatischen Rückgabewert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  return {&lt;br /&gt;
    vorname: vorname, &lt;br /&gt;
    nachname: nachname&lt;br /&gt;
    erstelleName: function() {&lt;br /&gt;
      return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Es ist folglich nicht sinnvoll einen Wert mit primitiven Datentyp als Rückgabewert zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zeigt innerhalb einer Konstruktorfunktion auf das automatisch erzeugte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Wird eine Konstruktorfunktion ohne &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen so zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; aber auf das globale Objekt (im Browser: &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(window.name);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung==&lt;br /&gt;
&lt;br /&gt;
Es ist bedingt möglich sicherzustellen dass eine Funktion mit dem Schlüsselwort &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wurde.&lt;br /&gt;
Dazu kann der &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt;-Operator genutzt werden.&lt;br /&gt;
Dieser überprüft ob das automatisch erzeugte Objekt mit einer bestimmten Konstruktorfunktion erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise funktioniert unter Umständen nicht wenn Vererbung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  if (!(this instanceof Person)) {&lt;br /&gt;
    throw new Error(&#039;Person is a constructor&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  this.name = name;&lt;br /&gt;
}&lt;br /&gt;
console.log(new Person(&#039;John Doe&#039;));&lt;br /&gt;
console.log(Person(&#039;Jan Doe&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternativen==&lt;br /&gt;
&lt;br /&gt;
Konstruktorfunktionen sollten im Allgemeinen nur verwendet werden wenn die Funktionsweise klar ist.&lt;br /&gt;
Vorteile bestehen zum Beispiel in der Syntax (Verwendung von &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) und der Möglichkeit &amp;lt;code&amp;gt;instanceof&amp;lt;/code&amp;gt; zu verwenden.&lt;br /&gt;
Viel wichtiger ist jedoch die effiziente Wiederverwendung von wenn sie in Kombination mit Prototypes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Flexibilität von JavaScript gibt es aber auch viele andere Möglichkeiten gleichartige Objekte zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erstellePerson = function(name, alter) {&lt;br /&gt;
  return {name: name, alter:};&lt;br /&gt;
}&lt;br /&gt;
var person1 = erstellePerson(&#039;Max Mustermann&#039;);&lt;br /&gt;
console.log(person1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typüberprüfung==&lt;br /&gt;
&lt;br /&gt;
===typeof-Operator===&lt;br /&gt;
&lt;br /&gt;
JavaScript bietet nativ verschiedene Möglichkeiten um Datentypen von Werten zu bestimmen.&lt;br /&gt;
Zum einen gibt es den &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator, ähnlich wie in anderen Sprachen (z.B. C).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&#039;typeof 1 ist &#039; + typeof 1);&lt;br /&gt;
console.log(&#039;typeof &amp;quot;a&amp;quot; ist &#039; + typeof &#039;a&#039;);&lt;br /&gt;
console.log(&#039;typeof true ist &#039; + typeof true);&lt;br /&gt;
console.log(&#039;typeof null ist &#039; + typeof null);&lt;br /&gt;
console.log(&#039;typeof undefined ist &#039; + typeof undefined);&lt;br /&gt;
console.log(&#039;typeof function() {} ist &#039; + typeof function() {});&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abseits von primitiven Datentypen, einfachen Objekten und Funktionen funktioniert der Operator allerdings nicht wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;typeof person1 ist &#039; + typeof person1);&lt;br /&gt;
&lt;br /&gt;
var person2 = null;&lt;br /&gt;
console.log(&#039;typeof person2 ist &#039; + typeof person2);&lt;br /&gt;
&lt;br /&gt;
var zahlen = [1, 2, 3, 4, 5];&lt;br /&gt;
console.log(&#039;typeof zahlen ist &#039; + typeof zahlen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbst bei Wrappern für primitive Datentypen liefert der &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator keine nützlichen Resultate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wahr = new Boolean(true);&lt;br /&gt;
console.log(&#039;typeof wahr ist &#039; + typeof wahr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Object.prototype.toString()===&lt;br /&gt;
&lt;br /&gt;
Eine Alternative zu dem &amp;lt;code&amp;gt;typeof&amp;lt;/code&amp;gt;-Operator ist die &amp;lt;code&amp;gt;toString()&amp;lt;/code&amp;gt;-Methode auf dem &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Prototypen.&lt;br /&gt;
Diese kann auf jedes beliebige Objekt angewendet werden und liefert bessere Resultate für native Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var getType = function(object) {&lt;br /&gt;
  return Object.prototype.toString.call(object);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;getType() von [] ist &#039; + getType([]));&lt;br /&gt;
console.log(&#039;getType() von {} ist &#039; + getType({}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eigene Klassen bleibt der Rückgabewert allerdings &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt; und damit relativ unspezifisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(name) {&lt;br /&gt;
  this.name = name;&lt;br /&gt;
};&lt;br /&gt;
var person1 = new Person(&#039;John Doe&#039;);&lt;br /&gt;
console.log(&#039;getType() von person1 ist &#039; + getType(person1));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=this=&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; hat JavaScript unterschiedliche Bedeutungen je nach Kontext.&lt;br /&gt;
Des Weiteren kann es mithilfe von ein paar nativen Funktionen manipuliert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Kontexte==&lt;br /&gt;
&lt;br /&gt;
1. Wenn eine Funktion über eine Variable aufgerufen wird und somit &lt;br /&gt;
nicht als Eigenschaft eines Objekts dann zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das globale Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei spielt es keine Rolle ob die Funktion global ist oder sich innerhalb einer anderen Funktion befindet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tuEtwas = function() {&lt;br /&gt;
  var loggeThis = function() {&lt;br /&gt;
    console.log(this);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
tuEtwas();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wenn eine Funktion als Eigenschaft eines Objekts aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  erstelleName: function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
console.log(person1.erstellName());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist zu beachten wie eine Funktion zum Zeitpunkt des Aufrufens referenziert wird.&lt;br /&gt;
&lt;br /&gt;
Da Funktionen freie Objekte sind können sie gleichzeitig als Objekteigenschaften und auch Variablen verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeThis = function() {&lt;br /&gt;
  console.log(this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
person1 = {&lt;br /&gt;
  vorname: &#039;Max&#039;,&lt;br /&gt;
  nachname: &#039;Mustermann&#039;,&lt;br /&gt;
  loggePerson: loggeThis&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
person1.loggePerson();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Wenn eine Funktion als Konstruktor mit &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; aufgerufen wird zeigt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; auf das automatisch erstellte Objekt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleInitialen = function() {&lt;br /&gt;
    return this.vorname.charAt(0) + this.nachname.charAt(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manipulation von this==&lt;br /&gt;
&lt;br /&gt;
Mithilfe von zwei Funktionen kann kontrolliert werden auf was &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb einer aufgerufenen Funktion verweist.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; ist auf jeder Funktion verfügbar, führt diese aus und akzeptiert zwei Argumente.&lt;br /&gt;
Das erste Argument ist das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Ausführung zeigt.&lt;br /&gt;
Das zweite Argument ist ein Array welches als Liste von Argumenten für den Funkionsaufruf verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(mitPunkten) {&lt;br /&gt;
  var i1 = this.vorname.charAt(0);&lt;br /&gt;
  var i2 = this.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen.apply(person2, [true]);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;call()&amp;lt;/code&amp;gt; ist sehr ähnlich zu &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt;, akzeptiert allerdings beliebig viele Argumente.&lt;br /&gt;
&lt;br /&gt;
Das erste Argument ist ebenfalls das Objekt auf welches &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bei der Funktionsausführung zeigt.&lt;br /&gt;
Die restlichen Argumente sind wiederum die Argumente welche an die ausführende Funktionen übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist die Verwendung von &amp;lt;code&amp;gt;apply()&amp;lt;/code&amp;gt; flexibler, da sie mit einem Array arbeitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Normalfall ist eine Manipulation von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; nicht notwendig und kann elegant umgangen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var erstelleInitialen = function(person, mitPunkten) {&lt;br /&gt;
  var i1 = person.vorname.charAt(0);&lt;br /&gt;
  var i2 = person.nachname.charAt(0);&lt;br /&gt;
  if (mitPunkten) {&lt;br /&gt;
     return i1 + &#039;.&#039; + i2 + &#039;.&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return i1 + i2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person2 = new Person(&#039;John&#039;, &#039;Doe&#039;);&lt;br /&gt;
var initialen = erstelleInitialen(person2, true);&lt;br /&gt;
console.log(initialen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sichere Verwendung in Konstruktorfunktionen==&lt;br /&gt;
&lt;br /&gt;
Einer der häufigsten Fehler in JavaScript ist die falsche Verwendung von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; innerhalb von Konstruktorfunktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
  this.erstelleNamen = function() {&lt;br /&gt;
    return this.vorname + &#039; &#039; + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Problem kann leicht umgangen werden indem man eine Hilfsvariable erzeugt und ihr den Wert von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; zuweist.&lt;br /&gt;
Auf diese Weise kann man in immer das aktuell erzeugte Objekt referenzieren unabhängig von dem aktuellen Scope.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
  self.vorname = vorname;&lt;br /&gt;
  self.nachname = nachname;&lt;br /&gt;
  self.erstelleNamen = function() {&lt;br /&gt;
    return self.vorname + &#039; &#039; + self.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var loggeErgebnisVonFunktion = function(funktion) {&lt;br /&gt;
  console.log(funktion());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
loggeErgebnisVonFunktion(person1.erstelleNamen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Prototypen=&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Prototypen ist es möglich in JavaScript Vererbungshierarchien abzubilden und Wiederverwendung zu erreichen.&lt;br /&gt;
Anders als bei klassenbasierten Sprachen spricht man nicht von Instanzen und Klassen, sondern von Objekten und Prototypen.&lt;br /&gt;
Jedes Objekt kann auf einen Prototypen verweisen, muss dies aber nicht. Prototypen selbst sind ebenfalls Objekte.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Prototypen==&lt;br /&gt;
&lt;br /&gt;
Jede erstellte Funktion erhält automatisch eine Eigenschaft namens &amp;quot;prototype&amp;quot;, welches auf den Prototypen verweist.&lt;br /&gt;
Dieser erhält außerdem eine Eigenschaft &amp;quot;constructor&amp;quot;, welche wiederum auf die Konstruktorfunktion selbst verweist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var prototyp = Person.prototype;&lt;br /&gt;
console.log(prototyp.constructor == Person);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn ein Objekt mit einem Konstruktor erzeugt wird erhält es eine versteckte Referenz auf diesen Prototypen.&lt;br /&gt;
In älteren ECMAScript-Versionen gibt es keine &#039;&#039;&#039;standardisierte&#039;&#039;&#039; Weise um auf den Prototypen eines Objekts zuzugreifen.&lt;br /&gt;
In ECMAScript 5 wurde dafür die Funktion &amp;lt;code&amp;gt;Object.getPrototypeOf()&amp;lt;/code&amp;gt; eingeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen erweitern==&lt;br /&gt;
&lt;br /&gt;
Da es sich beim Prototypen eines Konstruktors um eine Referenz auf ein Objekt handelt kann dies beliebig modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname + this.nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich die Referenz selbst zu verändern. Eine solche Änderung betrifft aber &#039;&#039;&#039;nicht&#039;&#039;&#039; bereits erzeugte Objekte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype = {&lt;br /&gt;
  erstelleInitialen: function() {&lt;br /&gt;
    return this.vorname + this.nachname;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person = new Person();&lt;br /&gt;
console.log(&#039;Prototyp von person ist &#039; + Object.getPrototypeOf(person));&lt;br /&gt;
&lt;br /&gt;
Person.prototype = {};&lt;br /&gt;
console.log(Object.getPrototypeOf(person) == Person.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Prototype-Chain==&lt;br /&gt;
&lt;br /&gt;
Beim Zugriff auf eine Eigenschaft eines Objekts wird zunächst überprüft ob das Objekt selbst diese Eigenschaft bestizt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
var person = new Person(&#039;John&#039;);&lt;br /&gt;
consol.log(person.vorname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Fall so wird überprüft ob der Prototyp des Objekts diese Eigenschaft besitzt.&lt;br /&gt;
Besitzt der Prototyp eine passende Eigenschaft wird diese verwendet, so als ob sie zum Objekt selbst gehört.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Person.prototpye.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt der Prototyp selbst auch nicht die Eigenschaft wird getestet ob das wiederum bei seinem Prototypen der Fall ist. &lt;br /&gt;
Dies wird so lange fortgesetzt bis die Eigenschaft gefunden wird oder bis es keinen Prototypen mehr in der Kette gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this.vorname = vorname;&lt;br /&gt;
  this.nachname = nachname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
prototypVomPrototyp.erstelleInitialen = function() {&lt;br /&gt;
  return this.vorname.charAt(0) + this.nachname.charAt(0);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(&#039;Initialen von person1 sind &#039; + person1.erstelleInitialen());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Der Prototyp einer selbst erstellten Funktion ist ein automatisch erzeugtes Objekt. &lt;br /&gt;
&lt;br /&gt;
Dementsprechend ist der Prototyp des Prototypen wiederum der der &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;-Konstruktorfunktion.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {}&lt;br /&gt;
var prototypVomPrototyp = Object.getPrototypeOf(Person.prototype);&lt;br /&gt;
console.log(prototypVomPrototyp == Object.prototype);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wiederverwendung==&lt;br /&gt;
&lt;br /&gt;
Wenn man mit sehr vielen Objekten arbeitet und auf den Speicherverbrauch achten muss können Prototypen sinnvoll sein.&lt;br /&gt;
Verwendet man einen Konstruktor der jedem erzeugten Objekt eine Funktion zuweist so ist dies jedes Mal eine neue Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var anzahlErstellterFunktionen = 0;&lt;br /&gt;
var erstelleHalloWeltFunktion = function() {&lt;br /&gt;
  anzahlErstellterFunktionen++;&lt;br /&gt;
  return function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = erstelleHalloWeltFunktion();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var personen = [];&lt;br /&gt;
for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;
  personen.push(new Person());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
console.log(&#039;anzahlErstellterFunktionen ist &#039; + anzahlErstellterFunktionen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weist man jedoch anstelle der Objekte dem Prototypen eine Funktion zu so wird nur eine erzeugt und diese wiederverwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {};&lt;br /&gt;
Person.prototype.sagHallo = function() {&lt;br /&gt;
  console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person();&lt;br /&gt;
var person2 = new Person();&lt;br /&gt;
console.log(&#039;Es ist immer die gleiche Funktion: &#039; + (person1.sagHallo == person2.sagHallo == Person.prototype.sagHallo));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypische Vererbung==&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt ist es mit Prototypen möglich Wiederverwendung und ähnliches Verhalten von Objekten zu erreichen.&lt;br /&gt;
Verwendet man als Prototypen ein Objekt welches auch mit einem Konstruktor erstellt wurde erhält man prototypische Vererbung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function() {&lt;br /&gt;
  this.sagHallo = function() {&lt;br /&gt;
    console.log(&#039;Hallo Welt&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Student = function() {&lt;br /&gt;
  this.schreibHtml = function() {&lt;br /&gt;
    console.log(&#039;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&#039;);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
console.log(student1.sagHallo());&lt;br /&gt;
console.log(student1.schreibHtml());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prototypen auf nativen Objekten==&lt;br /&gt;
&lt;br /&gt;
Jedes Objekt in JavaScript wird mithilfe einer Konstruktorfunktion erzeugt welche einen Prototypen besitzt.&lt;br /&gt;
Demzufolge ist es möglich das Verhalten von nativen Objekten zu verändern indem man auf den Prototypen modifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Object.prototype.sagMirWasDuBist = function() {&lt;br /&gt;
  console.log(typeof this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = {};&lt;br /&gt;
person1.sagMirWasDuBist();&lt;br /&gt;
&lt;br /&gt;
var funktion = function() {};&lt;br /&gt;
funktion.sagMirWasDuBist();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Diese Vorgehensweise sollte vermieden werden und wird aus den folgenden Gründen als Anti-Pattern eingestuft:&lt;br /&gt;
&lt;br /&gt;
* Eingeführte Funktionen können in Konflikt kommen mit neu eingeführten ECMAScript-Funktionen &lt;br /&gt;
* In größeren Projekten können leicht Konflikte entstehen bei gleichen/doppelt belegten Funktionsnamen&lt;br /&gt;
* Es entsteht der Eindruck dass es sich um eine echte native JavaScript-Funktion handelt&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Vererbung==&lt;br /&gt;
&lt;br /&gt;
Obwohl es in JavaScript die Möglichkeit gibt Vererbungshierarchien abzubilden wird dies oft in der Praxis nicht gemacht.&lt;br /&gt;
Stattdessen folgen viel dem Paradigma [http://en.wikipedia.org/wiki/Composition_over_inheritance Composition over Inheritance].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kapselung=&lt;br /&gt;
&lt;br /&gt;
Kapselung ermöglicht Zugriffe auf Daten und Informationen zu steuern und auch zu verhindern.&lt;br /&gt;
&lt;br /&gt;
==Closures==&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann man, abgesehen von neueren ECMAScript-Standards, nur mithilfe von Closures echte Kapselung erreichen.&lt;br /&gt;
Eine Closure wird immer dann geformt wenn eine innere Funktion aus ihrem Erstellungskontext nach außen gegeben wird.&lt;br /&gt;
Dadurch wird der Kontext in dem die Funktion definiert wurde so lange am Leben erhalten wie die Funktion selbst besteht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var erzeugeLogFunktion = function(prefix) {&lt;br /&gt;
  var logge = function(message) {&lt;br /&gt;
    console.log(prefix + message);&lt;br /&gt;
  };&lt;br /&gt;
  return logge;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var logge = erzeugeLogFunktion(&#039;Nachricht:&#039;);&lt;br /&gt;
logge(&#039;Hello World&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von Closures innerhalb von Konstruktoren kann man in Funktionen auf Variablen die von außen nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  var name = vorname + &#039; &#039; + nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var person1 = new Person(&#039;Max&#039;, &#039;Mustermann&#039;);&lt;br /&gt;
console.log(person1.hatNamen(&#039;Martina Mustermann&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo-private Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Closures können relativ schwer verständlich sein und erfordern einen sicheren Umgang mit der Sprache JavaScript.&lt;br /&gt;
Eine einfache Pseudokapselung kann erreicht werden, indem vor Namen von privaten Eigenschaften ein Unterstrich vorangestellt wird.&lt;br /&gt;
Diese Syntax hat zwar keine Auswirkung auf die Zugriffsmöglichkeiten, wird jedoch oft verwendet in der JavaScript-Commmunity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Person = function(vorname, nachname) {&lt;br /&gt;
  this._vorname = vorname;&lt;br /&gt;
  this._nachname = nachname;&lt;br /&gt;
  this._name = this._vorname + &#039; &#039; + this._nachname;&lt;br /&gt;
  this.hatNamen = function(zuPruefenderName) {&lt;br /&gt;
    return this._name === zuPruefenderName;&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Benutzer:Lawrence&amp;diff=38011</id>
		<title>Benutzer:Lawrence</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Benutzer:Lawrence&amp;diff=38011"/>
		<updated>2015-09-18T09:59:49Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: Die Seite wurde neu angelegt: „= Alexander Lawrence =  Lehrbeauftragter für Multimedia an der Hochschule Augsburg  Fachgebiete: * Agile Softwareentwick…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Alexander Lawrence =&lt;br /&gt;
&lt;br /&gt;
Lehrbeauftragter für [[Multimedia]] an der [[Wikipedia:Hochschule Augsburg|Hochschule Augsburg]]&lt;br /&gt;
&lt;br /&gt;
Fachgebiete:&lt;br /&gt;
* Agile Softwareentwicklung&lt;br /&gt;
* Webentwicklung&lt;br /&gt;
* Web Frontend&lt;br /&gt;
* JavaScript (Backend und Frontend)&lt;br /&gt;
* Design Patterns und Architekturen wie MVC und CQRS&lt;br /&gt;
* Domain Driven Design&lt;br /&gt;
* Event Sourcing&lt;br /&gt;
&lt;br /&gt;
[[en:User:Lawrence]]&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Pr%C3%BCfung:MMProg:WiSe2014:Teil_2&amp;diff=35898</id>
		<title>Prüfung:MMProg:WiSe2014:Teil 2</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Pr%C3%BCfung:MMProg:WiSe2014:Teil_2&amp;diff=35898"/>
		<updated>2015-01-16T10:45:31Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Aufgabe 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=MMProg Prüfungspraktikum WiSe 2014/2015=&lt;br /&gt;
&lt;br /&gt;
==Teil 2==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Prüfungspraktikum werden Ihnen Skripte zur Verfügung gestellt für den Checkout sowie für den Commit.&lt;br /&gt;
Bitte versuchen Sie &#039;&#039;&#039;nicht&#039;&#039;&#039; selbst einen Checkout zu machen oder direkt über WebStorm zu committen.&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung===&lt;br /&gt;
&lt;br /&gt;
Um diese Aufgabe zu bearbeiten müssen Sie alle Schritte ausgeführt haben welche in der Vorbereitung von Teil 1 beschrieben sind.&lt;br /&gt;
&lt;br /&gt;
===Spielregeln===&lt;br /&gt;
&lt;br /&gt;
In diesem Teil des Prüfungspraktikums geht es darum ein teilweise implementiertes Spiel fertigzustellen.&lt;br /&gt;
&lt;br /&gt;
Die Spielregeln sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
* Anfangs erscheint ein Ziel in der Mitte des Spielfelds (blau)&lt;br /&gt;
* Der Spieler (grün) muss sich mithilfe der Cursor-Tasten zu diesem Ziel begeben um einen Punkt zu erhalten&lt;br /&gt;
* Der Computergegner (rot) bewegt sich ebenfalls zu dem Ziel; beim Erreichen verliert der Spieler einen Punkt&lt;br /&gt;
* Wurde das Ziel von einem der beiden Mitspieler erreicht wird die Position des Ziels zufällig verändert&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 1===&lt;br /&gt;
&lt;br /&gt;
Bearbeiten Sie diese Einzelaufgabe, indem Sie ausschliesslich die Datei &amp;quot;controller/PlayerController.js&amp;quot; erweitern.&lt;br /&gt;
Die Komponente &amp;quot;PlayerController&amp;quot; soll Tastatureingaben verarbeiten und daraufhin das Spielerobjekt entsprechend bewegen.&lt;br /&gt;
&lt;br /&gt;
Implementieren Sie dazu folgendes Verahlten:&lt;br /&gt;
&lt;br /&gt;
* Beim Drücken der linken Cursortaste erhält der Spieler eine horizontale Geschwindigkeit von -1&lt;br /&gt;
* Beim Drücken der rechten Cursortaste erhält der Spieler eine horizontale Geschwindigkeit von 1&lt;br /&gt;
* Beim Drücken der oberen Cursortaste erhält der Spieler eine vertikale Geschwindigkeit von -1&lt;br /&gt;
* Beim Drücken der unteren Cursortaste erhält der Spieler eine vertikale Geschwindigkeit von 1&lt;br /&gt;
* Beim Loslassen der linken oder rechten Cursortaste erhält der Spieler eine horizontale Geschwindigkeit von 0&lt;br /&gt;
* Beim Loslassen der oberen oder unteren Cursortaste erhält der Spieler eine vertikale Geschwindigkeit von 0&lt;br /&gt;
* Das Browser-Standardverhalten beim Drücken und Loslassen von Tasten soll unterdrückt werden&lt;br /&gt;
&lt;br /&gt;
Wenn Sie anschließend den Browser öffnen und die Datei &amp;quot;index.html&amp;quot; laden sollten Sie den Spieler frei bewegen können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 2===&lt;br /&gt;
&lt;br /&gt;
Bearbeiten Sie diese Einzelaufgabe, indem Sie ausschliesslich die Datei &amp;quot;model/Enemy.js&amp;quot; erweitern.&lt;br /&gt;
Die Komponente &amp;quot;Enemy&amp;quot; simuliert den Computergegner und soll sich stets automatisch auf das &amp;quot;Goal&amp;quot;-Objekt zu bewegen.&lt;br /&gt;
&lt;br /&gt;
Implementieren Sie dazu folgendes Verhalten nacheinander in der Funktion &amp;quot;self._aimAtGoal()&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* Der Gegner erhält zunächst eine horizontale und vertikale Geschwindigkeit von 0&lt;br /&gt;
* Besitzt der Gegner kein ausgewähltes Ziel wird die Funktion sofort wieder beendet&lt;br /&gt;
* Es werden die Mittelpunkte (x, y) vom Gegner selbst und dem ausgewählten Ziel bestimmt&lt;br /&gt;
* Mithilfe der Mittelpunkte werden die x- und y-Entfernung vom Gegner zum ausgewählten Ziel bestimmt&lt;br /&gt;
* Falls der Betrag der x-Entfernung größer ist als der Betrag der y-Entfernung&lt;br /&gt;
** und falls die x-Entfernung größer ist als null, erhält der Gegner eine horizontale Geschwindigkeit von -0.85&lt;br /&gt;
** und falls die x-Entfernung kleiner ist als null, erhält der Gegner eine horizontale Geschwindigkeit von 0.85&lt;br /&gt;
* Falls der Betrag der y-Entfernung größer ist als der Betrag der x-Entfernung&lt;br /&gt;
** und falls die y-Entfernung größer ist als null, erhält der Gegner eine vertikale Geschwindigkeit von -0.85&lt;br /&gt;
** und falls die y-Entfernung kleiner ist als null, erhält der Gegner eine vertikale Geschwindigkeit von 0.85&lt;br /&gt;
&lt;br /&gt;
Wenn Sie anschließend den Browser öffnen und die Datei &amp;quot;index.html&amp;quot; neu laden sollte der Gegner stets das Ziel verfolgen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Nutzen Sie &amp;lt;code&amp;gt;Math.abs()&amp;lt;/code&amp;gt; um den Betrag einer Zahl zu berechnen.&lt;br /&gt;
&lt;br /&gt;
===Abgabe===&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zunächst WebStorm und alle weiteren Programme die Sie geöffnet haben.&lt;br /&gt;
Öffnen Sie dann erneut das Terminal und führen Sie folgenden Befehl aus: &amp;quot;sh commit.sh&amp;quot;.&lt;br /&gt;
Geben Sie Ihr RZ-Passwort ein falls Sie dazu aufgefordert werden.&lt;br /&gt;
Öffnen Sie abschließend folgende URL im Browser um zu überprüfen ob der Commit erfolgreich durchgeführt wurde:&lt;br /&gt;
https://praktikum.multimedia.hs-augsburg.de/svn/RZ-Kennung/pruefung_20150119 (ersetzen Sie RZ-Kennung durch Ihre eigene)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ihr Prüfung wurde nur abgegeben falls Ihre Dateien erfolgreich committed wurden!&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Pr%C3%BCfung:MMProg:WiSe2014:Teil_1&amp;diff=35897</id>
		<title>Prüfung:MMProg:WiSe2014:Teil 1</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Pr%C3%BCfung:MMProg:WiSe2014:Teil_1&amp;diff=35897"/>
		<updated>2015-01-16T10:44:49Z</updated>

		<summary type="html">&lt;p&gt;Lawrence: /* Aufgabe 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=MMProg Prüfungspraktikum WiSe 2014/2015=&lt;br /&gt;
&lt;br /&gt;
==Teil 1==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Im Prüfungspraktikum werden Ihnen Skripte zur Verfügung gestellt für den Checkout sowie für den Commit.&lt;br /&gt;
Bitte versuchen Sie &#039;&#039;&#039;nicht&#039;&#039;&#039; selbst einen Checkout zu machen oder direkt über WebStorm zu committen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorbereitung===&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie das Terminal und führen Sie folgenden Befehl aus: &amp;quot;./setupenv.sh RZ-Kennung&amp;quot; (mit Ihrer eigenen RZ-Kennung).&lt;br /&gt;
Geben Sie Ihr RZ-Passwort ein falls Sie dazu aufgefordert werden.&lt;br /&gt;
Falls Sie außerdem noch gefragt werden ob das Passwort gespeichert werden soll, verweigern Sie dies mit &amp;quot;nein&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Das Skript &amp;quot;setupenv.sh&amp;quot; erledigt die folgenden Aufgaben:&lt;br /&gt;
* Checkout von Ihrem eigenen Repository in das Verzeichnis &amp;quot;~/Arbeitsfläche/repository&amp;quot;&lt;br /&gt;
* Anlegen des Verzeichnis &amp;quot;pruefung_20150119&amp;quot; innerhalb von Ihrem &amp;quot;repository&amp;quot;-Verzeichnis&lt;br /&gt;
* Befüllen des neuen Verzeichnis mit allen notwendigen Prüfungsdateien&lt;br /&gt;
* Ausführen von &amp;quot;svn add&amp;quot; auf allen Prüfungsdateien damit sie später committed werden&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Anschluss WebStorm vom Desktop aus und wählen Sie Ihr Repository-Verzeichnis als Projekt.&lt;br /&gt;
Navigieren Sie dann innerhalb von WebStorm zu dem Prüfungsordner &amp;quot;pruefung_20150119&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bearbeiten Sie die nachfolgenden Aufgaben, indem Sie ausschliesslich die Datei &amp;quot;index.js&amp;quot; entsprechend modifizieren.&lt;br /&gt;
Fügen Sie den Code für die einzelnen Aufgaben der Übersichtlichkeit halber immer nach den zugehörigen Kommentaren ein.&lt;br /&gt;
&lt;br /&gt;
Nutzen Sie die Funktion &amp;lt;code&amp;gt;log()&amp;lt;/code&amp;gt; der bereits erzeugten Logger-Instanz namens &amp;quot;logger&amp;quot; um Ihre Nachrichten auszugeben.&lt;br /&gt;
Öffnen Sie zu gegebenen Zeitpunkten die Datei &amp;quot;index.html&amp;quot; im Browser um die Korrektheit Ihres Codes zu überprüfen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 1===&lt;br /&gt;
&lt;br /&gt;
Geben Sie den String &amp;quot;MMProg Prüfungspraktikum WiSe 2014/2015&amp;quot; (ohne Anführungszeichen) aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 2===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie die Variablen &amp;quot;firstName&amp;quot; und &amp;quot;lastName&amp;quot; und weisen Sie ihnen Ihren eigenen Vornamen bzw. Nachnamen als Wert zu.&lt;br /&gt;
Geben Sie dann die Variablen durch ein Leerzeichen getrennt und vorangestellt durch die Zeichenkette &amp;quot;Name: &amp;quot; aus.&lt;br /&gt;
&lt;br /&gt;
Beispielausgabe: &amp;quot;Name: Max Mustermann&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 3===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie die Variable &amp;quot;birthday&amp;quot; und weisen Sie dieser ein neues, leeres Objekt zu (mittels Konstruktor oder Objektliteral).&lt;br /&gt;
Erzeugen Sie auf dem Objekt die Eigenschaften &amp;quot;day&amp;quot;, &amp;quot;month&amp;quot; und &amp;quot;year&amp;quot; und befüllen Sie diese mit den jeweiligen Werten Ihres Geburtsdatums.&lt;br /&gt;
Geben Sie dann die Variablen aus, jeweils durch einen Punkt getrennt und vorangestellt durch die Zeichenkette &amp;quot;Geburtsdatum: &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispielausgabe: &amp;quot;Geburtsdatum: 01.02.1999&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 4===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie die Variable &amp;quot;skills&amp;quot; und weisen Sie dieser ein neues, leeres Array zu (mittels Konstruktor oder Array-Literal).&lt;br /&gt;
Fügen Sie dann nacheinander drei Strings in das Array ein, welche jeweils eine Fähigkeit von Ihnen beschreiben.&lt;br /&gt;
Falls Ihnen keine Fähigkeiten einfallen, die Sie nennen möchten, so verwenden Sie einfach drei aus der folgenden Liste:&lt;br /&gt;
Design, Konzeption, Planung, Kostenkalkulation, Implementierung, Architektur, Recherche.&lt;br /&gt;
&lt;br /&gt;
Geben Sie zunächst den String &amp;quot;Skills:&amp;quot; aus.&lt;br /&gt;
Nutzen Sie dann eine &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleife um jedes einzelne Element aus dem Array vorangestellt durch den String &amp;quot;* &amp;quot; auszugeben.&lt;br /&gt;
&lt;br /&gt;
Beispielausgabe:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Skills:&lt;br /&gt;
* Planung&lt;br /&gt;
* Kostenkalkulation&lt;br /&gt;
* Recherche&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 5===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie eine Funktion namens &amp;quot;divideInteger&amp;quot; welche eine ganzzahlige Teilung für zwei beliebige Zahlen ausführen soll.&lt;br /&gt;
Die Funktion akzeptiert die beiden Argumente &amp;quot;number&amp;quot; und &amp;quot;factor&amp;quot; und teilt &amp;quot;number&amp;quot; ganzzahlig durch &amp;quot;factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiele für ganzzahlige Teilungen:&lt;br /&gt;
* 5 / 2 = 2&lt;br /&gt;
* 7 / 3 = 2&lt;br /&gt;
* 3 / 2 = 1&lt;br /&gt;
&lt;br /&gt;
Rufen Sie dann die Funktion &amp;quot;divideInteger&amp;quot; mit folgenden Wertkombinationen auf und geben Sie die Ergebnisse aus:&lt;br /&gt;
* number: 5, factor: 2&lt;br /&gt;
* number: 4, factor: 2&lt;br /&gt;
* number: 1, factor: 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 6===&lt;br /&gt;
&lt;br /&gt;
In dieser Aufgabe sollen zwei Studenten und deren Semesterarbeit als stark vereinfachtes Objektmodell abgebildet werden.&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie die Objekte &amp;quot;studentObject1&amp;quot; und &amp;quot;studentObject2&amp;quot; mit den Eigenschaften &amp;quot;firstName&amp;quot;, &amp;quot;lastName&amp;quot; und &amp;quot;matriculationNumber&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Das erste Objekt erhält folgende Werte:&lt;br /&gt;
* &amp;quot;firstName&amp;quot; =&amp;gt; &amp;quot;Max&amp;quot;&lt;br /&gt;
* &amp;quot;lastName&amp;quot; =&amp;gt; &amp;quot;Mustermann&amp;quot;&lt;br /&gt;
* &amp;quot;matriculationNumber&amp;quot; =&amp;gt; 1234&lt;br /&gt;
&lt;br /&gt;
Das zweite Objekt erhält folgende Werte:&lt;br /&gt;
* &amp;quot;firstName&amp;quot; =&amp;gt; &amp;quot;Moritz&amp;quot;&lt;br /&gt;
* &amp;quot;lastName&amp;quot; =&amp;gt; &amp;quot;Mustermann&amp;quot;&lt;br /&gt;
* &amp;quot;matriculationNumber&amp;quot; =&amp;gt; 4321&lt;br /&gt;
&lt;br /&gt;
Beide Objekte erhalten die Funktion &amp;quot;getDescription&amp;quot;, welche die Kombination aus Vornamen, Nachnamen und Immatrikulationsnummer zurückgibt.&lt;br /&gt;
Der Rückgabe-String soll bestehen aus der Zeichenkette &amp;quot;Name: &amp;quot;, Vorname und Nachname durch ein Leerzeichen getrennt,&lt;br /&gt;
der Zeichenkette &amp;quot;, Matrikelnummer: &amp;quot; und der Matrikelnummer selbst, sodass eine schön formattierte Ausgabe entsteht.&lt;br /&gt;
Rufen Sie die Funktion &amp;quot;getDescription()&amp;quot; beider Objekte auf und geben Sie das Ergebnis jeweils mit dem Logger aus.&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie dann das Objekt &amp;quot;projectObject&amp;quot; welches die beiden Eigenschaften &amp;quot;title&amp;quot; und &amp;quot;authors&amp;quot; erhält.&lt;br /&gt;
&amp;quot;title&amp;quot; wird mit dem Wert &amp;quot;Flappy Bird&amp;quot; belegt, &amp;quot;authors&amp;quot; mit einem Array welches die beiden zuvor erstellten Studenten-Objekte enthält.&lt;br /&gt;
&lt;br /&gt;
Das Projektobjekt erhält ebenfalls eine Funktion &amp;quot;getDescription&amp;quot;, welche folgende Informationen als String zurückgeben soll:&lt;br /&gt;
* Titel des Projekts, vorangestellt durch den String &amp;quot;Titel: &amp;quot;&lt;br /&gt;
* Den Rückgabewert der Funktion &amp;quot;getDescription&amp;quot; von jedem am Projekt beteiligten Autor&lt;br /&gt;
&lt;br /&gt;
Dabei sollte der Titel des Projekts sowie jeder einzelne Autor jeweils auf einer einzelnen Zeile ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Um eine neue Zeile zu erzeugen können Sie ein &amp;amp;lt;br&amp;amp;gt;-Tag am Ende eines Strings einfügen (&amp;quot;&amp;amp;lt;br&amp;amp;gt;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Rufen Sie die Funktion &amp;quot;getDescription&amp;quot; des Projektobjekts auf und geben Sie das Ergebnis mit dem Logger aus.&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 7===&lt;br /&gt;
&lt;br /&gt;
In dieser Aufgabe sollen Sie den oben beschriebenen Sachverhalt nun mithilfe von Konstruktorfunktionen abbilden.&lt;br /&gt;
Dabei gilt es eine Konstruktorfunktion namens &amp;quot;Student&amp;quot; und eine namens &amp;quot;StudentProject&amp;quot; zu implementieren.&lt;br /&gt;
&amp;quot;Student&amp;quot; akzeptiert die Argumente &amp;quot;firstName&amp;quot;, &amp;quot;lastName&amp;quot; und &amp;quot;matriculationNumber&amp;quot; und weist diese der jeweiligen Instanz zu.&lt;br /&gt;
&amp;quot;StudentProject&amp;quot; akzeptiert die beiden Argumente &amp;quot;title&amp;quot; und &amp;quot;authors&amp;quot; und weist diese ebenso der jeweiligen Instanz zu.&lt;br /&gt;
&lt;br /&gt;
Beide Konstruktoren weisen den erzeugten Objekten auch eine Funktion &amp;quot;getDescription&amp;quot; zu, welche sich wie oben beschrieben verhält.&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie dann mittels dem &amp;quot;Student&amp;quot;-Konstruktor die beiden Objekte &amp;quot;studentInstance1&amp;quot; und &amp;quot;studentInstance2&amp;quot;.&lt;br /&gt;
&amp;quot;studentInstance1&amp;quot; erhält die gleichen Werte wie &amp;quot;studentObject1&amp;quot;, &amp;quot;studentInstance2&amp;quot; die gleichen wie &amp;quot;studentObject1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie mittels dem &amp;quot;StudentProject&amp;quot;-Konstruktor das Objekt &amp;quot;projectInstance&amp;quot; als Pendant zu &amp;quot;projectObject&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Rufen Sie die Funktion &amp;quot;getDescription&amp;quot; ebenso auf allen erzeugten Instanzen auf und geben Sie die Rückgabewerte mit dem Logger aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 8===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie ein &amp;quot;div&amp;quot;-DOM-Element und speichern Sie dieses in einer Variable namens &amp;quot;timestamp&amp;quot;.&lt;br /&gt;
Weisen Sie dem inneren HTML des DOM-Elements als Wert die Kombination aus dem String &amp;quot;Aktuelle Zeit: &amp;quot; und dem aktuellen Datum zu.&lt;br /&gt;
Fügen Sie dann das erzeugte DOM-Element am Ende des &amp;quot;body&amp;quot;-DOM-Elements des aktuellen Dokuments ein.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie die Seite nun im Browser betrachten sollte am Ende des Dokuments jeweils die aktuelle Zeit vom Seitenaufruf stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 9===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie die Funktion &amp;quot;updateTimestamp&amp;quot; welche ebenso dem inneren HTML des zuvor erstellen &amp;quot;div&amp;quot;-DOM-Elements&lt;br /&gt;
die Kombination aus dem String &amp;quot;Aktuelle Zeit: &amp;quot; und dem aktuellen Datum zuweist.&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie dann einen *geeigneten* und sich wiederholenden Timer welcher ungefähr jede Sekunde die Funktion &amp;quot;updateTimestamp&amp;quot; aufruft.&lt;br /&gt;
Begründen Sie in einem Satz in einem Code-Kommentar Ihre Entscheidung bezgülich des gewählten Timers.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie die Seite nun im Browser betrachten sollte sich die aktuelle Zeit ungefähr jede Sekunde aktualisieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 10===&lt;br /&gt;
&lt;br /&gt;
Erzeugen Sie einen globalen Event-Listener für das &amp;quot;click&amp;quot;-Event auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
In der Callback-Funktion soll überprüft werden ob das jeweilige Ereignisziel als &amp;quot;class&amp;quot;-Attribut den Wert &amp;quot;message&amp;quot; besitzt.&lt;br /&gt;
Ist dies der Fall, so soll der CSS-Eigenschaft &amp;quot;color&amp;quot; vom Ereignisziel der Wert &amp;quot;red&amp;quot; zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie nun auf einzelne Ausgaben klicken sollten diese rot eingefärbt werden.&lt;/div&gt;</summary>
		<author><name>Lawrence</name></author>
	</entry>
</feed>