Patrick Andrieu: Zählerverständnis

Hallo alle!

  
for (i=1; i<3; i++) {  
  alert(i);  
  dc.getElementById('id_eines_elements').onclick = function() {  
    alert ('i= '+i);  
  };  
}  

Der erste alert bewirkt, dass hintereinander zwei alert-Boxen aufpoppen, die Schleife wird durchgelaufen: 1, 2

Warum aber gibt der zweite alert die Meldung i=3, obwohl in der Schleife ausdrücklich i<3 definiert ist?

Viele Grüße aus Frankfurt/Main,
Patrick

--

_ - jenseits vom delirium - _
<hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>
Nichts ist unmöglich? Doch!
  1. for (i=1; i<3; i++) {

    Warum aber gibt der zweite alert die Meldung i=3, obwohl in der Schleife ausdrücklich i<3 definiert ist?

    Hi,

    Denk mal kurz nach. Ist 3 denn kleiner als 3? Der zweite "parameter" für for ist die Bedingung die erfüllt sein msus damit die Schleife weiterläuft. Wenn i nun 3 wird, dann gilt 3 < 3 und das ist definitiv falsch. Was du willst ist also entweder i <= 3 oder gleich i < 4

    Man bringt das gerne durcheinander, weil die meisten Programmierer ihre Schleifen mit 0 beginnen lassen und die Bedingung i < 3 würde mit einem Startwert von 0 genau 3 Elemente ausspucken (0,1,2), d.h. die Zahl in der Bedingung entspricht der Zahl der Elemente. Da du aber mit 1 startest musst du entsprechend 1 draufzählen oder eine kleiner-gleich Bedingung vorgeben.

    Viel Spaß weiterhin,
    Michael

    1. Hallo Michael!

      Was du willst ist also entweder i <= 3

      Im zweiten alert ist dann i = 4

      oder gleich i < 4

      i = 5

      Und das deckt sich mit den Aussagen von Mathias und wahsaga, dass das der Wert von i nach dem Schleifendurchlauf ist.

      Vielen Dank für alle Antworten, ich muss mein Vorhaben etwas überarbeiten ;)

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>
      Nichts ist unmöglich? Doch!
      1. Und das deckt sich mit den Aussagen von Mathias und wahsaga, dass das der Wert von i nach dem Schleifendurchlauf ist.

        Das schlimme an der ganzen Sache ist, dass du das i global definierst (weshalb es auch nach der Schleife zu Verfügung steht). Globale Variabeln sind immer eine schlechte Idee, globale Schleifen Variabeln sind eine Dummheit.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Hallo Struppi!

          Das schlimme an der ganzen Sache ist, dass du das i global definierst (weshalb es auch nach der Schleife zu Verfügung steht). Globale Variabeln sind immer eine schlechte Idee, globale Schleifen Variabeln sind eine Dummheit.

          Mit for (var i=1;i<3;i++) erhalte ich immer noch 3...

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>
          Nichts ist unmöglich? Doch!
          1. Das schlimme an der ganzen Sache ist, dass du das i global definierst (weshalb es auch nach der Schleife zu Verfügung steht). Globale Variabeln sind immer eine schlechte Idee, globale Schleifen Variabeln sind eine Dummheit.

            Mit for (var i=1;i<3;i++) erhalte ich immer noch 3...

            Schon klar, meine Bemerkung hatte nichts mit deinem Ausgangsproblem zu tun, es geht nur um den Stil. So Fehler die du nur schwer finden kannst (z.b. wenn du in der Schleife eine Funktion mit einer Schleife aufrufst, die auch i verwendet)

            Struppi.

            --
            Javascript ist toll (Perl auch!)
  2. Hallo Patrick.

    for (i=1; i<3; i++) {
      alert(i);
      dc.getElementById('id_eines_elements').onclick = function() {
        alert ('i= '+i);
      };
    }

    
    >   
    > Der erste alert bewirkt, dass hintereinander zwei alert-Boxen aufpoppen, die Schleife wird durchgelaufen: 1, 2  
    >   
    > Warum aber gibt der zweite alert die Meldung i=3, obwohl in der Schleife ausdrücklich i<3 definiert ist?  
      
    Weil das der Wert ist, den i nach allen Schleifendurchläufen hat; i = 3, damit nicht mehr kleiner als 3, womit die Schleife abbrach. Am Wert ändert sich aber nichts.  
      
      
    Einen schönen Montag noch.  
      
    Gruß, Mathias  
    
    -- 
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)  
      
    debian/rules
    
  3. hi,

    Warum aber gibt der zweite alert die Meldung i=3, obwohl in der Schleife ausdrücklich i<3 definiert ist?

    Weil sie erst _lange nach_ der Schleife ausgeführt wird, und dann den _zu diesem Zeitpunkt aktuellen_ Wert von i ausgibt.
    Und der ist nun mal 3, weil nach dem Schleifendurchlauf, in dem i den Wert 2 hatte, i++ ausgeführt wird, i also den Wert 3 bekommt - und _danach_ die Schleife bei der Prüfung der Bedingung i<3 feststellt, dass sie jetzt die Arbeit einstellen sollte.

    Wenn du den jeweils im Schleifendurchlauf aktuellen Wert von i in der Behandlung des Events diverser Elemente bekommen willst, nutze entweder Closures, oder lege den Wert als Eigenschaft an diesem Element selber ab.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      Wenn du den jeweils im Schleifendurchlauf aktuellen Wert von i in der Behandlung des Events diverser Elemente bekommen willst, nutze entweder Closures, oder lege den Wert als Eigenschaft an diesem Element selber ab.

      Er nutzt ja Closures (erst dadurch ist i in den Handlerfunktionen verfügbar), aber das ist das Problem. Zu Closures und Schleifen:

      </archiv/2006/9/t136283/#m885076>
      </archiv/2006/10/t138533/#m900197>
      </archiv/2006/12/t141557/#m919914>
      http://www.howtocreate.co.uk/referencedvariables.html

      Mathias

      1. Hallo molily!

        Er nutzt ja Closures (erst dadurch ist i in den Handlerfunktionen verfügbar), aber das ist das Problem.

        Ja, ohne es zu wissen, nutze ich so was Tolles? ;)

        Zu Closures und Schleifen:
        http://www.howtocreate.co.uk/referencedvariables.html

        Danke, das war's. Und so sieht die komplette Sache, für die ich den jeweiligen Wert von i gebraucht habe, jetzt aus:

          
        for (var i=1; i<contentDivs.length; i++) {  
          dc.getElementById('weiter'+i).onclick = (function(a,b) {  
            return function() {  
            var j = a-1;  
            var divbefore = "bang"+j;  
            dc.getElementById(divbefore).style.display = 'none';  
            b.style.display = 'block';  
            b.className = 'bangtext';  
            b.style.top = (404 - b.offsetHeight)/2+"px";  
            };  
          })(i,contentDivs[i]);  
        }  
        };  
        
        

        Also vielen lieben Dank an Mathias und allen Beteiligten! Die Tage optimiere ich das noch...

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>
        Nichts ist unmöglich? Doch!