JavaScript – Das Handbuch für die Praxis. David Flanagan

JavaScript  –  Das Handbuch für die Praxis - David Flanagan


Скачать книгу

       5.5Sprünge

      Eine weitere Kategorie von JavaScript-Anweisungen sind Sprunganweisungen. Wie der Name schon andeutet, veranlassen sie den JavaScript-Interpreter, an eine andere Stelle des Quellcodes zu springen. Die break-Anweisung weist den Interpreter an, an das Ende einer Schleife oder einer anderen Anweisung zu springen. continue lässt den Interpreter den Rest des Schleifenkörpers überspringen und zum Anfang der Schleife zurückkehren, um einen neuen Durchlauf zu beginnen. In JavaScript können Anweisungen benannt bzw. markiert werden. break und continue können anhand einer solchen Sprungmarke bzw. eines Labels die Zielschleife oder andere Anweisungen identifizieren.

      Die return-Anweisung veranlasst den Interpreter, aus einer aufgerufenen Funktion zurück zum aufrufenden Code zu springen. Dabei wird der Rückgabewert von return zum Wert des dortigen Aufrufausdrucks. Die yield-Anweisung ist eine Art vorläufiges return aus einer Generatorfunktion. Die throw-Anweisung löst eine Ausnahme (Exception) aus und ist für den Einsatz mit try/catch/finally-Anweisungen gedacht, die Code zur Fehlerbehandlung enthalten. Sie ist eine komplizierte Form einer Sprunganweisung: Wird eine Ausnahme ausgelöst, springt der Interpreter zum nächsten umschließenden Exceptionhandler, der sich innerhalb derselben Funktion oder in einer Funktion weiter oben im Aufrufstapel befinden kann.

      Einzelheiten zu diesen Sprunganweisungen finden Sie in den folgenden Abschnitten.

       5.5.1Benannte Anweisungen

      Anweisungen können benannt werden, indem man ihnen einen Identifier und einen Doppelpunkt voranstellt:

      Identifier: Anweisung

      Wenn Sie einer Anweisung einen Namen geben, können Sie ihn an anderer Stelle des Programms benutzen, um auf diese Anweisung zu verweisen. Obwohl Sie alle Anweisungen benennen können, ist das nur bei solchen sinnvoll, die einen Körper haben, also beispielsweise bei Schleifen oder Bedingungen. Geben Sie einer Schleife einen Namen, können Sie im Inhalt der Schleife break- und continue-Anweisungen nutzen, um die Schleife zu verlassen oder sofort wieder an den Anfang der Schleife zu springen, um den nächsten Durchlauf zu beginnen. break und continue sind die einzigen JavaScript-Anweisungen, die auf Benennungen anderer Anweisungen zurückgreifen. Sie werden später in diesem Kapitel behandelt. Hier ist ein Beispiel für eine benannte while-Schleife und eine continue-Anweisung, die das vergebene Label nutzt.

      mainloop: while(token !== null) {

      // Code ausgelassen …

      continue mainloop; // Zur nächsten Iteration der angegebenen Schleife springen.

      // Mehr Code ausgelassen …

      }

      Der Identifier, mit dem Sie eine Anweisung benennen, kann ein beliebiger zulässiger JavaScript-Identifier sein, der selbst kein reserviertes Wort ist. Sprungmarken haben einen anderen Namensraum als Variablen und Funktionen. Sie können also gleichnamige Identifier parallel als Anweisungsmarkierung und als Variablen- oder Funktionsnamen nutzen. Eine Anweisungsmarke ist nur in der Anweisung definiert, die durch sie benannt ist (und natürlich in eventuellen Unteranweisungen). Ist eine Anweisung in einer anderen, umgebenden Anweisung enthalten, dürfen beide nicht gleich benannt sein, ansonsten schon. Markierte Anweisungen können selbst markiert sein. Das bedeutet praktisch, dass jede Anweisung mehrere Labels haben kann.

       5.5.2break

      Wird die break-Anweisung eigenständig verwendet, dann wird dadurch die innerste Schleife oder switch-Anweisung sofort verlassen. Ihre Syntax ist simpel:

      break;

      Diese Form der break-Anweisung ist aufgrund ihrer Wirkung nur innerhalb von Schleifen oder switch-Anweisungen erlaubt.

      Beispiele für eine break-Anweisung, die in einer switch-Anweisung vorkommt, haben Sie bereits kennengelernt. In Schleifen wird sie normalerweise eingesetzt, um vorzeitig abzubrechen, wenn es aus irgendeinem Grund nicht mehr nötig ist, die Schleife noch weiter fortzusetzen. Enthält eine Schleifenanweisung komplexe Abbruchbedingungen, lassen sich einige dieser Bedingungen oft leichter mit break-Anweisungen formulieren, anstatt alle in einen einzigen Schleifenausdruck zu packen. Der folgende Code durchsucht die Elemente eines Arrays nach einem bestimmten Wert. Die Schleife wird auf übliche Weise beendet, wenn das Ende des Arrays erreicht ist. Ansonsten wird sie per break-Anweisung verlassen, sobald der gesuchte Wert im Array gefunden wird:

      for(let i = 0; i < a.length; i++) {

      if (a[i] === target) break;

      }

      In JavaScript kann nach dem Schlüsselwort break eine Anweisungsmarke angegeben werden (nur der Identifier, ohne Doppelpunkt):

      break Sprungmarke;

      Wird break mit einer Sprungmarke verwendet, springt es zum Ende der umschließenden Anweisung mit der entsprechenden Sprungmarke bzw. beendet diese. Gibt es keine umschließende Anweisung mit der entsprechenden Sprungmarke, führt das zu einem Syntaxfehler. Bei dieser Form der break-Anweisung muss die benannte Anweisung nicht notwendigerweise eine Schleife oder ein switch sein: Mit break kann man aus jeder umschließenden Anweisung »ausbrechen«. Das kann auch ein Anweisungsblock sein, der nur deshalb mit geschweiften Klammern umgeben wurde, damit man ihn überhaupt mit einer Sprungmarke versehen kann.

      Zwischen dem Schlüsselwort break und der Sprungmarke ist ein Zeilenumbruch nicht erlaubt. Das ist eine Folge der automatischen Einfügung ausgelassener Semikola, die JavaScript vornimmt: Fügen Sie zwischen break und der darauffolgenden Sprungmarke einen Zeilenumbruch ein, geht JavaScript davon aus, dass Sie die einfache, sprungmarkenlose Form der Anweisung nutzen wollten, und behandelt den Zeilenumbruch als Semikolon (siehe 2.6).

      Möchten Sie aus einer Anweisung »ausbrechen«, die nicht die nächste umschließende Schleife oder ein switch ist, müssen Sie bei der break-Anweisung eine Sprungmarke angeben. Das zeigt der folgende Code:

      let matrix = getData(); // Ein beliebiges zweidimensionales Array mit Zahlen

      // zuweisen.

      // Summieren wir nun alle Zahlen der Matrix.

      let sum = 0, success = false;

      // Beginnen wir mit einer benannten Anweisung, die wir verlassen können,

      // wenn Fehler auftreten.

      computeSum: if (matrix) {

      for(let x = 0; x < matrix.length; x++) {

      let row = matrix[x];

      if (!row) break computeSum;

      for(let y = 0; y < row.length; y++) {

      let cell = row[y];

      if (isNaN(cell)) break computeSum;

      sum += cell;

      }

      }

      success = true;

      }

      // Hierhin springen die break-Anweisungen. Wenn wir hier mit success == false

      // landen, dann hat mit der Matrix etwas nicht gestimmt.

      // Ansonsten enthält sum die Summe aller Zellen der Matrix.

      Abschließend sollten Sie sich noch merken, dass eine break-Anweisung – ob mit oder ohne Sprungmarke – den Programmfluss nicht über Funktionsgrenzen hinaus übergeben kann. Wird eine Anweisung zur Funktionsdefinition mit einer Sprungmarke versehen, kann man diese deshalb nicht innerhalb der Funktion verwenden.

       5.5.3continue

      Die continue-Anweisung ähnelt der break-Anweisung. Anstatt aber eine Schleife zu verlassen,


Скачать книгу