Robert B.: Frage zum Wiki-Artikel „Funktion“

Beitrag lesen

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