Zählerverständnis
Patrick Andrieu
- javascript
0 Michael H.0 Mathias Brodala0 wahsaga
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
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
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
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.
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
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.
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
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
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
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