Christof Rüge: Frage zum Wiki-Artikel „Schleife“

problematische Seite

Ich würde gerne wissen, ob auch bei continue ein Schleifenname angegeben werden kann. Und sicherheitshalber sollte auch angegeben werden, ob auch Schleifen innerhalb anderer Funktionen damit gesteuert werden können. (und sei es nur mit break)

  1. problematische Seite

    Tach!

    Ich würde gerne wissen, ob auch bei continue ein Schleifenname angegeben werden kann.

    "Deshalb gibt es zusätzliche Befehle, um innerhalb einer Schleife das Geschehen zu kontrollieren."

    Und sicherheitshalber sollte auch angegeben werden, ob auch Schleifen innerhalb anderer Funktionen damit gesteuert werden können. (und sei es nur mit break)

    "Innerhalb" schließt aus, dass man von außerhalb was regeln kann. Zudem ist Javascript single-threaded. Wenn eine Schleife läuft, kann nicht anderswo Code parallel laufen.

    dedlfix.

    1. problematische Seite

      Zudem ist Javascript single-threaded. Wenn eine Schleife läuft, kann nicht anderswo Code parallel laufen.

      Noch... Die Webworker haben die erste Bresche geschlagen. Um die hier schon angedeuteten Probleme zu vermeiden, laufen sie in einem getrennten Kontext und verlangen ein Messaging Protokoll. Aber wer weiß schon, wann echtes Multithreading mit gemeinsamem Speicher die JavaScript-Welt ins finale Chaos stürzt und ein Thread das i eines anderen zertrumpelt.

      Rolf

  2. problematische Seite

    Hallo Christof,

    Ich würde gerne wissen, ob auch bei continue ein Schleifenname angegeben werden kann.

    Ja. continue hat die gleichen Eigenschaften wie break.

    Und sicherheitshalber sollte auch angegeben werden, ob auch Schleifen innerhalb anderer Funktionen damit gesteuert werden können. (und sei es nur mit break)

    Ich gehe davon aus, dass das geht, aber ich habe es nicht verifiziert - das kannst du ja auch sehr einfach selber ausprobieren. Aber das solltest du auf keinen Fall tun. Das führt nur zu schlecht modularisiertem Code und wird eher früher als später Probleme aufwerfen.

    LG,
    CK

    1. problematische Seite

      Hallo,

      Aber das solltest du auf keinen Fall tun.

      Abgesehen davon, kann ich mir grad keine Situation vorstellen, wo das nötig wäre. Entweder will man mit continue diese Schleife, in der man sich grad befindet, neu beginnen oder eben mit break in eine höhere Ebene wechseln.

      Aber wie gesagt, break und continue sollte sowieso möglichst vermieden werden.

      Gruß
      Kalk

      1. problematische Seite

        Hallo Tabellenkalk,

        Aber wie gesagt, break und continue sollte sowieso möglichst vermieden werden.

        Das halte ich für zu weit gegriffen. Ich verwende break und continue gerne, weil ich damit sicherstellen kann, dass die Abbruch-Bedingungen lesbar bleiben.

        Aber ich würde immer abraten, von einer inner loop eine outer loop zu steuern und von Funktion A eine Schleife in Funktion B zu steuern, das ist ein no-go – wer soll da noch durchblicken⁉️

        LG,
        CK

        1. problematische Seite

          Tach!

          Aber ich würde immer abraten, von einer inner loop eine outer loop zu steuern und von Funktion A eine Schleife in Funktion B zu steuern, das ist ein no-go – wer soll da noch durchblicken⁉️

          Wie machst du denn sowas unter Javascript? Oder meinst du dass Funktion A vom Schleifenkörper in Funktion B aufgerufen wurde? Dann böte es sich eher an, dass A ein entsprechend auswertbares Ergebnis zurückgibt oder eine Exception wirft, die man in B abfangen kann.

          dedlfix.

          1. problematische Seite

            Hallo dedlfix,

            Aber ich würde immer abraten, von einer inner loop eine outer loop zu steuern und von Funktion A eine Schleife in Funktion B zu steuern, das ist ein no-go – wer soll da noch durchblicken⁉️

            Wie machst du denn sowas unter Javascript? Oder meinst du dass Funktion A vom Schleifenkörper in Funktion B aufgerufen wurde?

            Ja.

            function b() {
              foo: for(var i=0;i < 10; ++i) {
                a(i);
              }
            }
            
            function a(i) {
              console.log(i);
              break foo;
            }
            

            Glücklicherweise geht das aber eh nicht, wie ich soeben festgestellt habe:

            VM100:9 Uncaught SyntaxError: Undefined label 'foo'
                at b (<anonymous>:3:5)
                at <anonymous>:1:1
            

            Dann böte es sich eher an, dass A ein entsprechend auswertbares Ergebnis zurückgibt oder eine Exception wirft, die man in B abfangen kann.

            Ja.

            LG,
            CK

            1. problematische Seite

              Hallo Christian Kruse,

              function b() {
                foo: for(var i=0;i < 10; ++i) {
                  a(i);
                }
              }
              
              function a(i) {
                console.log(i);
                break foo;
              }
              

              Auf so eine Idee würde ja nicht mal ich kommen und das will schon was heißen. 😉

              Bis demnächst
              Matthias

              --
              Rosen sind rot.
            2. problematische Seite

              Tach!

              Wie machst du denn sowas unter Javascript? Oder meinst du dass Funktion A vom Schleifenkörper in Funktion B aufgerufen wurde?

              Ja.

              function b() {
                foo: for(var i=0;i < 10; ++i) {
                  a(i);
                }
              }
              
              function a(i) {
                console.log(i);
                break foo;
              }
              

              Glücklicherweise geht das aber eh nicht, wie ich soeben festgestellt habe:

              Damit wären ja auch Sprünge kreuz und quer durch den Code möglich, denn es ist ja nicht festgetackert, dass a generell nur von b aus aufgerufen werden kann. Ruft man es also von anderswo auf, soll dann der Code abrupt dort enden und mitten in B weitergehen?

              Und selbst wenn a aus b aufgerufen würde, sollte das dann a einfach so mittendrin beenden? Na gut, mit einem return springt man auch mitten aus einer Funktion heraus. Aber bei einem solchen Beenden kann man wenigstens recht einfach alles wegräumen, was auf dem Stack für diese Funktion rumliegt. Es ist aber nicht so einfach, bei einem Hineinsprung alles das anzulegen, was angelegt worden wäre, wenn der Code von Anfang an ausgeführt worden wäre.

              dedlfix.

              1. problematische Seite

                Hallo dedlfix,

                Damit wären ja auch Sprünge kreuz und quer durch den Code möglich, denn es ist ja nicht festgetackert, dass a generell nur von b aus aufgerufen werden kann. Ruft man es also von anderswo auf, soll dann der Code abrupt dort enden und mitten in B weitergehen?

                […]

                Was meinst du, warum ich gesagt habe „Das solltest du auf keinen Fall tun”? 😜

                Technisch ist das durchaus möglich, siehe z.B. goto, longjmp und Konsorten.

                LG,
                CK

            3. problematische Seite

              Hi,

              function b() {
                foo: for(var i=0;i < 10; ++i) {
                  a(i);
                }
              }
              
              function a(i) {
                console.log(i);
                break foo;
              }
              

              Also bitte - sowas macht man doch auch nicht mit break, das macht man mit goto !!!

              😉

              cu,
              Andreas a/k/a MudGuard

              1. problematische Seite

                @@MudGuard

                Also bitte - sowas macht man doch auch nicht mit break, das macht man mit goto !!!

                Ich vermisse die Zeilennummern.

                LLAP 🖖

                --
                “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
                1. problematische Seite

                  Hallo Gunnar,

                  Also bitte - sowas macht man doch auch nicht mit break, das macht man mit goto !!!

                  Ich vermisse die Zeilennummern.

                  Das erinnert mich an mein erstes Programm:

                  10 PRINT "Hallo"
                  20 GOTO 10
                  

                  In dem Zusammenhang auch: Fifty years of BASIC.

                  LG,
                  CK

                  1. problematische Seite

                    Oh ja, solche Fotos wie im Artikel habe ich auch schon stellen müssen. Ganz gelassen beisammenstehen, einer zeigt was, die anderen schauen aufmerksam zu - PASSIERT EINEM REAL PROGRAMMER[1] NIE!

                    Rolf


                    1. Unter anderem, weil ein Real Programmer nicht im Büro ist, wenn solche Fotos gemacht werden, und man das Listing am Tisch eines Real Programmers nicht zwischen Colabechern und Snackautomatentüten finden würde. ↩︎

                2. problematische Seite

                  Hallo,

                  Ich vermisse die Zeilennummern.

                  Selbst auf dem Mac sollte es Editoren geben, die die Zeilen in der richtigen Reihenfolge durchnummerieren können! Übrigens eine Erfindung von Otto, der es geschafft hat, in seinem BUCH alle Seiten in richtiger Reihenfolge zu beschriften!

                  Gruß
                  Kalk

                  1. problematische Seite

                    @@Tabellenkalk

                    Selbst auf dem Mac sollte es Editoren geben, die die Zeilen in der richtigen Reihenfolge durchnummerieren können! Übrigens eine Erfindung von Otto, der es geschafft hat, in seinem BUCH alle Seiten in richtiger Reihenfolge zu beschriften!

                    Also ich halte das für schier unmöglich – bei so vielen verschiedenen Möglichkeiten.

                    Otto hat dann am Ende nicht etwa 1000 Seiten vergessen?

                    LLAP 🖖

                    --
                    “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
                    1. problematische Seite

                      Hallo,

                      Otto hat dann am Ende nicht etwa 1000 Seiten vergessen?

                      höchstens zwölf.

                      Gruß
                      Kalk

        2. problematische Seite

          Hi,

          Aber ich würde immer abraten, von einer inner loop eine outer loop zu steuern

          bei z.B. einer Suche über ein zweidimensionales Array halte ich es für legitim, bei Auftreten eines Suchtreffers in der inneren Schleife auch gleich die äußere mit abzubrechen.

          bzw. analog bei einer Suche über ein n-dimensionales Array mit n verschachtelten Schleifen, alle äußeren Schleifen abzubrechen, wenn in der innersten die Suche erfolgreich war.

          cu,
          Andreas a/k/a MudGuard

          1. problematische Seite

            Hallo MudGuard,

            Aber ich würde immer abraten, von einer inner loop eine outer loop zu steuern

            bei z.B. einer Suche über ein zweidimensionales Array halte ich es für legitim, bei Auftreten eines Suchtreffers in der inneren Schleife auch gleich die äußere mit abzubrechen.

            Es gibt immer Ausnahmen, ja.

            LG,
            CK