Rolf B: Frage zum Wiki-Artikel „Funktion“

problematische Seite

Hallo alle,

der verlinkte Wiki-Artikel sagt, dass dieser Code verboten sei:

if (a > 4) {                // Untergeordneter Anweisungsblock beginnt
   function berechne(q) {   // Nicht erlaubt!
      return q*4;
   }
} else {
   function berechne(q) {   // Nicht erlaubt!
      return q*7;
   }
}

Begründung: Wegen des Hoistings käme es zu einer Namenskollision.

Ich habe das gerade in Chrome probiert, und stelle fest:

  • die Funktion wird nicht vor die geschweifte Klammer gehoben, in der sie definiert ist
  • Die Funktion ist hinter der geschweiften Klammer, in der sie definiert wurde, immer noch sichtbar (d.h. wird korrekt im function scope definiert und nicht lokal im Anweisungsblock)
  • abhängig vom Wert von a steht beim Aufruf der passende Funktionsbody zur Verfügung.

Ist das neu in Chrome? Ist das nur in Chrome?

Dass es programmierte Sch... ist, will ich nicht abstreiten.

Rolf

--
sumpsi - posui - obstruxi
  1. problematische Seite

    Hallo Rolf,

    im Firefox funktioniert es auch.

    Gruß
    Jürgen

  2. problematische Seite

    Moin Rolf,

    der verlinkte Wiki-Artikel sagt, dass dieser Code verboten sei:

    if (a > 4) {                // Untergeordneter Anweisungsblock beginnt
       function berechne(q) {   // Nicht erlaubt!
          return q*4;
       }
    } else {
       function berechne(q) {   // Nicht erlaubt!
          return q*7;
       }
    }
    

    Begründung: Wegen des Hoistings käme es zu einer Namenskollision.

    Ich habe das gerade in Chrome probiert, und stelle fest:

    • die Funktion wird nicht vor die geschweifte Klammer gehoben, in der sie definiert ist
    • Die Funktion ist hinter der geschweiften Klammer, in der sie definiert wurde, immer noch sichtbar (d.h. wird korrekt im function scope definiert und nicht lokal im Anweisungsblock)
    • abhängig vom Wert von a steht beim Aufruf der passende Funktionsbody zur Verfügung.

    Ist das neu in Chrome? Ist das nur in Chrome?

    In Firefox sieht es genau so aus.

    Ich erkläre mir das so, dass der obige Code äquivalent ist zu

    if (a < 4) {
        var berechne = function(q) {
            return q*4;
        }
    } else {
        var berechne = function(q) {
            return q * 8;
        }
    } 
    

    Viele Grüße
    Robert

    1. problematische Seite

      Hallo Robert,

      ja, ist er. Und ich würde das gerne gegen den IE regressionstesten. Aber mittlerweile weigert sich Windows bei mir, den IE auch nur zu starten und poppt mir nur noch ein Edge-Tab auf, wenn ich den starten will 😕

      Rolf

      --
      sumpsi - posui - obstruxi
      1. problematische Seite

        Moin Rolf,

        Und ich würde das gerne gegen den IE regressionstesten.

        der macht das Gleiche.

        Viele Grüße
        Robert

        1. problematische Seite

          Hallo Robert,

          so, Regressionstest gelungen. Der IE11 macht das Gleiche. Aber nur der.

          Der IE10 hoistet die Funktion im else Teil ganz nach oben.

          if (foo)
          	console.log(foo());
          
          var a = 6;
          if (a > 4) {
             function foo() { return "über 4"; }
          }
          else {
             function foo() { return "Muh"; }
          }
          
          console.log(foo());
          

          Wenn ich den IE11 in den IE10 Mode schalte, gibt er zweimal "Muh" aus. Im IE11 Mode gibt er einmal "über 4" aus. Da scheint mit irgendeiner ECMAScript-Version etwas geändert worden zu sein.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. problematische Seite

            Moin Rolf,

            so, Regressionstest gelungen. Der IE11 macht das Gleiche. Aber nur der.

            Der IE10 hoistet die Funktion im else Teil ganz nach oben.

            wie kommt man denn noch an so einen Internet Explorer?

            Viele Grüße
            Robert

            1. problematische Seite

              Hallo,

              Der IE10 hoistet die Funktion im else Teil ganz nach oben.

              wie kommt man denn noch an so einen Internet Explorer?

              vielleicht auf einem alten Rechner, der noch mit Windows 7 bestückt ist und schon lange keine Updates mehr bekommt?[1] Oder in einer eigens für solche Zwecke eingerichteten VM?

              Wobei ... ich vermute, dass es schwierig ist, jetzt noch gezielt eine bestimmte alte IE-Version irgendwo zum Download zu finden.

              Einen schönen Tag noch
               Martin

              --
              "Was sind denn das für Beeren?" - "Das sind Blaubeeren." - "Warum sind sie dann rot?" - "Weil sie noch grün sind."

              1. Ich kenne jemanden, der sogar noch XP aktiv nutzt, weil eine teure CAD-Software, die er für die Arbeit braucht, auf neueren Windowsen nicht mehr laufen will. ↩︎

              1. problematische Seite

                Wobei ... ich vermute, dass es schwierig ist, jetzt noch gezielt eine bestimmte alte IE-Version irgendwo zum Download zu finden.

                Kein Problem.

            2. problematische Seite

              Hallo Robert,

              der ist auf meinem Windows 10 noch dabei. Im Internet Explorer 11 versteckt - muss man in den DevTools einschalten.

              Rolf

              --
              sumpsi - posui - obstruxi