2010-05-25 2 views
0

Как управлять, в котором, если else коррелирован?javascript - как управлять if/else if/else

например:

if X = 1 { // A 
    if Y > 1 { // B 
     gothere(); 
    } 
} 
else if X < 1 { // C 
    gohere(); 
} 
else { // D 
    gonowhere(); 
} 

как убедиться, C и D не будет связан с B ???

here's другой пример:

if xxx { 

    ... 

FM_log(7,"vList.length = "+vList.length); 

if (skippingAvancado) 
    if (vList.length > 1)   
    changeVillage(); 
else { 
    if (skipcounter >= maxSkipCount) { 
     FM_log(7,"ROTINA ANTIGA SKIPCOUNTER"); 
     changeVillage(); 
    } 
} 
else { 
+0

У вас нет? В этом весь смысл if-else if-else. Просто убедитесь, что вы используете {} соответствующим образом. – Intelekshual

+0

Пожалуйста, включите весь блок кода. Из висячего 'else {' ясно, что некоторые были опущены. –

ответ

1

Это проблема dangling else; это неоднозначно, и язык может выбрать либо конструкцию для привязки. Большинство (если не все) языков группировать еще с ближайшим если, так что было бы

if(foo) 
    if(bar) 
     baz; 
    else 
     bazz; 

На практике вы всегда должны использовать фигурные скобки, чтобы убедиться, что нет никакой двусмысленности, как вы это делали в первом примере. Если вы взяли фигурные скобки из первого примера, C и D будут прикреплены к B вместо A; поскольку вы включили их, блоки работают так, как вы хотели.

0

Пока вы помещаете скобки вокруг внешних if заявления, вы будете гарантировать внутреннюю if не коррелируют с внешним else:

if (X == 1) { // A 
    if (Y > 1) { // B 
     gothere(); 
    } 
} 

В ваш второй пример, я бы добавил скобки вокруг первого if, чтобы гарантировать, что его внутренний if имеет область действия:

if (skippingAvancado) { 
    if (vList.length > 1)   
    changeVillage(); 
} 
+0

Думаю, я мог бы сформулировать это лучше - но имеет ли это смысл? –

0

это простая логика, которой еще принадлежит, если ... вы управляете им, используя правильные скобки и гнездование.

+0

Это скорее комментарий, чем ответ –

0

В вашем первом примере C и D не будут связаны с B - это else s первого if (A). Это обеспечивается скобами. Во втором примере else будет, вероятно, соответствуют к второйif (else положения согласованы до ближайшего возможного if), так что вы должны добавить фигурные скобки вокруг

if (vList.length > 1)   
    changeVillage(); 

для обеспечения желаемого поведения.

0

Поскольку это звучит, как вы не в полной мере получили контроль как if/else конструкции работают, с или без блока утверждений, которые я предлагаю следующее:

  • Ставьте заявления внутри блоков {/*...*/}. Это гарантирует, что несколько операторов сгруппированы правильно.
  • Используйте правильный отступ (вручную, через вашу IDE или с помощью таких инструментов, как jsbeautifier.org] 1 /). Это даст вам визуальный сигнал о том, какие утверждения принадлежат друг другу. Каждый раз, когда вы пишете {, вы увеличиваете отступ, каждый раз, когда вы пишете }, вы уменьшаете его.

Как это:

| | | | 
if (foo){ // if1 
    if (bar){ //if2 
     ... 
    } else if (foobar) { //elseif if2 
     if (foobarfoo) { //if3 
      ... 
     } // end if3 
    } // end if2 
} else { //else if1 
    ... 
} // end if1 
| | | | 

Неспособность правильно группа вы будет заявление в некоторых браузерах привести к неправильной группировке дает вам ад для отладки.