JavaScript - как контролировать, если / еще, если / еще - PullRequest
0 голосов
/ 25 мая 2010

Как контролировать, с чем соотносится остальное?

например:

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

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

вот еще один пример:

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 {

Ответы [ 5 ]

1 голос
/ 25 мая 2010

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

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

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

0 голосов
/ 25 мая 2010

Так как кажется, что вы не полностью контролировали работу конструкций 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
|   |   |   |

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

0 голосов
/ 25 мая 2010

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

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

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

0 голосов
/ 25 мая 2010

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

0 голосов
/ 25 мая 2010

Пока вы заключаете скобки вокруг внешних if выражений, вы гарантируете, что внутренний if не соотнесен с внешним else:

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

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

if (skippingAvancado) {
   if (vList.length > 1)        
    changeVillage();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...