Enrico: Schleife wird nur einmalig ausgeführt

Hallo,

ich kann ein - für mich nicht nachvollziehbares - Verhalten bei der Ausführung einer JavaScript-Schleife nicht nachvollziehen.

Ich habe folgendes (hier gekürztes) Array definiert...

  
Hauptmenue = new Array ("Startseite", "Wir über uns", "Rüstzeug", "Waffen", "Gewandung", "Schmuck");  

...und arbeite es mittels folgender Schleife ab:

  
for (i = 0, l = Hauptmenue.length; i < l; i++)  
{  
   Sidebar += '<div class="Button">' + Hauptmenue[i] + '</div>';  
  
   Arrayname = TextBereinigen(Hauptmenue[i]);  
  
   alert(Arrayname);  
}  
  
function TextBereinigen(Text)  
{  
   if (Text.indexOf(" ") !== -1)  
   {  
      Worter = Text.split(" ");  
  
      Text = "";  
  
      for (i = 0, l = Worter.length; i < l; i++)  
      {  
         Worter[i] = Worter[i].substr(0, 1).toUpperCase() + Worter[i].substr(1);  
  
         Text = Text.concat(Worter[i]);  
      }  
   }  
  
   Text = Text.str_replace(["Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "/"], ["Ae", "ae", "Oe", "oe", "Ue", "ue", "ss", ""]);  
  
   return Text;  
}  

In dieser Konstellation wird mir die Schleife nur einmalig ausgeführt.

Lasse ich hingegen den Aufruf der Textbereinigungsfunktion weg und ersetze im alert-Befehl "Arrayname" gegen "Hauptmenue[i]", so werden mir alle Elemente ausgegeben.

Woran liegt dies?

Vielen Dank für eure Hilfe und Gruß,
Enrico

  1. Hi,

    Lasse ich hingegen den Aufruf der Textbereinigungsfunktion weg und ersetze im alert-Befehl "Arrayname" gegen "Hauptmenue[i]", so werden mir alle Elemente ausgegeben.

    Woran liegt dies?

    verfluchte globale Variablen aber auch!
    Deine Laufvariable i wird in beiden Programmteilen verwendet - und beidesmal dieselbe, weil die global ist.
    Das ist gar nicht schön.

    Ciao,
     Martin

    --
    Wer es in einem Unternehmen zu etwas bringen will, muss so tun, als hätte er es schon zu etwas gebracht.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hallo Enrico,

    Ich kann meine Tipps nur wiederholen:

    »Jedenfalls rate ich dir, dich genauer mit JavaScript zu beschäftigen. Z.B. in dem du ein gutes Buch durcharbeitest.«

    »Code sollte bestenfalls in wiederverwendbaren Funktionen strukturiert werden, welche lokale anstatt globale Variablen verwenden. Du verwendest überall globale Variablen ohne »var«. Variablen sollten auch mit Kleinbuchstaben beginnen, das ist eine sinnvolle Konvention, um sie von Konstruktoren zu unterscheiden.«

    »[…] entspricht new Array(…), allerdings ist es schneller, einfacher zu schreiben und eindeutig.«

    Ich habe diese Tipps gegeben, weil ich denke, dass sie dir das Programmieren vereinfachen und sie helfen, Fehler zu vermeiden. Lokale Variablen z.B. sind enorm wichtig. Das ist eine JavaScript-Grundlage, die ein gutes Buch vermittelt.

    Text = Text.str_replace(["Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "/"], ["Ae", "ae", "Oe", "oe", "Ue", "ue", "ss", ""]);

    String-Objekte haben keine str_replace-Methode (das hört sich stark nach PHP an). Hast du den STring-Prototype entsprechend erweitert oder wo kommt diese Funktion her?

    Es gibt in JavaScript die http://de.selfhtml.org/javascript/objekte/string.htm#replace@title=replace-Methode. Diese erwartet als ersten Parameter einen String oder einen RegExp und als zweiten Parameter einen String.

    Mehrere Ersetzungen lassen sich mit einer Schleife vornehmen. Man sollte auch nicht vergessen, den global-Flag (g) zu benutzen, sonst wird immer nur das erste Vorkommen ersetzt. Beispiel:

    var search = ['a', 'b', 'c'];  
    var replace = ['x', 'y', 'z'];  
    var text = 'abc';  
    for (var i = 0, l = ; i < l; i++) {  
      // Erzeuge neuen regulären Ausdruck  
      // Die Eingabe muss ggf. escaped werden  
      var regexp = new RegExp(search[i], 'g'); // g bedeutet: Ersetze alle Vorkommen  
      text = text.replace(regexp, replace[i]);  
    }
    

    Mathias

  3. Hallo molily und Martin,

    jetzt ist dieser Groschen gefallen :-)

    Verwende ich in jeder Funktion vor einer Variable "var", dann wird nichts überschrieben und es funktioniert :-)

    Danke euch beiden! :-)

    Gruß,
    Enrico