javascript - 如何控制if / else if / else

时间:2010-05-25 14:45:06

标签: javascript if-statement

如果控制else与之相关,如何控制?

例如:

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 个答案:

答案 0 :(得分:1)

这是dangling else问题;它是模糊的,语言可以选择要绑定的构造。大多数(如果不是全部)语言将else与最近的if组合在一起,所以它将是

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

在实践中,您应该始终使用大括号来确保没有歧义,就像您在第一个示例中所做的那样。如果你从第一个例子中取出括号,C和D将被附加到B而不是A;因为你包含它们,所以块可以按你的需要工作

答案 1 :(得分:0)

只要在外部if语句周围放置括号,就可以保证内部if与外部else无关:

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

在你的第二个例子中,我会在第一个if周围添加括号,以保证其内部if的范围正确:

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

答案 2 :(得分:0)

这是一个简单的逻辑,如果......你通过使用正确的括号和嵌套来控制它。

答案 3 :(得分:0)

在您的第一个示例中,C和D与B无关 - 它们是第一个else(A)的if个。这是由括号确保的。在第二个示例中,else可能对应于 second ifelse子句与最近的if匹配),因此你应该添加大括号

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

确保所需的行为。

答案 4 :(得分:0)

由于听起来你还没有完全控制if/else构造的工作方式,无论是否有块语句,我都提出以下建议:

  • 始终将语句放在blocs {/*...*/}中。这将确保正确地将多个语句组合在一起
  • 使用适当的缩进(手动,通过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
|   |   |   |

如果某些浏览器无法正确地对您的语句进行分组,则会导致错误的分组,从而导致您无法进行调试。