Toon posts:

[JS] switch met blockstatements binnen for-loop

Pagina: 1
Acties:
  • 364 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik zit hier met een vaag probleem. Op de een of andere manier krijg ik geen blockstatements binnen een switch niet aan de praat terwijl deze volgens de documentatie wel zouden moeten werken. Er zal vast ergens een heel domme fout zijn, maar ik zie hem gewoon weg niet.

Het probleem:

Ik heb een for-loop met daarbinnen een switch. De for-loop haalt een waarde uit een array en zet deze in een switch statement (string). De switch doet zijn werk, maar zorgt ervoor dat de for-loop onderbroken wordt direct na het uitvoren van het blockstatement. Ik heb hem al op diverse manieren geprobeerd maar steeds niet het gewenste resultaat. Wat wel werkt is als ik de blockstatements weg haal en daar een enkel statement gevolgd door een break neerzet.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
for (i = 0; i < commands.length; i++) {
    var command = commands[i];
    var commandValue = command.attributes.getNamedItem("value").value;
    switch (commandValue) {
        case "updateLine": {
            alert("updateLine");
            updateLines(command.getElementsByTagName("line"));
            break;
        }
        case "updateTotal": {
            alert("updateTotal");
            break;
        }
        case "findProduct": {
            alert("findProduct");
            break;
        }
    }
}


Wat ik wil bereiken is dat de loop helemaal afloopt wat er ook gebeurd binnen het switch statement. Binnen de cases van de switch moeten meerdere statements worden afgewerkt. Ik kan hiervoor wel aparte functies defineren maar zodat de blockstatements verwijderd kunnen worden maar dat zorgt er wel weer voor dat het minder leesbaar wordt.

Verwijderd

Welke documentatie, heb je linkie? Ik kan het iig nergens terug vinden en heb dit nog nooit eerder gezien, krijg je niet een syntax error (dat hij daarom niet verder runt)?

[ Voor 10% gewijzigd door Verwijderd op 08-06-2007 10:53 ]


Verwijderd

case statements kun je niet blocken zo. Dit is ook een case block:

JavaScript:
1
2
3
4
5
6
7
8
9
10
switch(s) {
  case "asd" : // begin block
    statement1;
    statement2;
    statement3;
    break; // eind block

  case "qwerty" :
    etc...
}

  • Willem2
  • Registratie: Oktober 2000
  • Laatst online: 01-12 15:53

Willem2

Ω is futile

Blocken of niet, deze code doet het prima in IE7:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<SCRIPT LANGUAGE="JavaScript">
<!--
commandValue = "updateLine";

    switch (commandValue) { 
        case "updateLine": { 
            alert("updateLine"); 
            //updateLines(command.getElementsByTagName("line")); 
            break; 
        } 
        case "updateTotal": { 
            alert("updateTotal"); 
            break; 
        } 
        case "findProduct": { 
            alert("findProduct"); 
            break; 
        } 
    } 
//-->
</SCRIPT>


Dus de fout zit in het stukje ervoor volgens mij...

en nee, ik houd niet van voetbal... :)


Verwijderd

Willem2 schreef op vrijdag 08 juni 2007 @ 11:02:
Blocken of niet, deze code doet het prima in IE7:
Klopt, ik praat weer eens onzin; natuurlijk kun je zo'n block maken met {} binnen een case 8)7

Verwijderd

Topicstarter
Optix:

Er zijn verschillende sites met javascript references, zoals:
http://docs.sun.com/source/816-6408-10/stmt.htm#1018610
http://developer.mozilla....ference:Statements:switch

Blues:

Gelukkig dacht dat ik al gek werd. Blockstatements in Javascript zijn volgens mij altijd {...}.


Willem2:

Ik heb net het hele script zo ver mogelijk vereenvoudigd. Ik denk inderdaad nu dat het probleem verderop ligt namelijk in de functies die worden aangeroepen.

.....
Tijdens het typen van deze reply bedenk ik me op eens dat in de aangeroepen functies ook een for-loop loopt deze had ik ook gedefineerd met als counter "i". Als ik deze verander in iets anders loopt het wel door. Ik zei toch al dat het iets stoms moest zijn. :X

In ieder geval bedankt voor het mee denken, scheelt mij zeker uren uitpuzzelen!!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Wat staat er in de error log van FireFox? Geeft de eventueel geinstalleerde scriptdebugger van IE iets aan?

iOS developer


Verwijderd

Topicstarter
De Javascript-console van mozilla gaf geen foutmeldingen weer. Op zich klopt dat ook. De counter uit de eerste for-loop werd door de counter van de tweede for-loop (andere functie) verhoogt waardoor de conditie van de eerste loop false werd. Ik ben zelf C++ en dergelijke gewend waar de scope van variable anders ligt dan bij javascript waarschijnlijk.

Verwijderd

Verwijderd schreef op vrijdag 08 juni 2007 @ 11:54:
Tijdens het typen van deze reply bedenk ik me op eens dat in de aangeroepen functies ook een for-loop loopt deze had ik ook gedefineerd met als counter "i". Als ik deze verander in iets anders loopt het wel door. Ik zei toch al dat het iets stoms moest zijn. :X
Ik moet zeggen dat ik daar al aan dacht toen ik
JavaScript:
1
for(i = 0 ...

zag.

Variabelen gedeclareerd zonder var zijn altijd globaal in JavaScript, probeer dus altijd
JavaScript:
1
for(var i = 0 ...

te gebruiken (dan hoef je die andere for loop ook niet over een andere variabelenaam te laten itereren.

Verwijderd

Uuuh ja maar niet met block quotes om de cases :Y)

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 08 juni 2007 @ 12:46:
Uuuh ja maar niet met block quotes om de cases :Y)
Het staat er wel degelijk:
switch
Allows a program to evaluate an expression and attempt to match the expression's value to a case label.

Implemented in JavaScript 1.2, NES 3.0

Syntax

switch (expression){
case label :
statements;
break;
case label :
statements;
break;
...
default : statements;
}

Parameters

expression
Value matched against label.

label
Identifier used to match against expression.

statements
Block of statements that is executed once if expression matches label.
Bij statements staat Block of statements oftewel een block statement zie onderstaande link.

http://developer.mozilla....1.5_Guide:Block_Statement

Verwijderd

/me geeft even een tik aan zijn monitor, maar nee. Ziet echt geen block quotes om de cases staan. Wel om de switch, maar dat is logisch :)

[ Voor 6% gewijzigd door Verwijderd op 08-06-2007 19:37 . Reden: typersfouten ]

Pagina: 1