2010-05-25 112 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 2010-05-25 14:50:50

+0

請包括整個代碼塊。從懸掛的其他部分可以清楚地看出,有些人被遺漏了。 – 2010-05-25 18:42:02

回答

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

我想我可以更好地表達這一點 - 但這有意義嗎? – 2010-05-25 14:50:28

0

它是簡單的邏輯,其他屬於哪個如果...你可以通過使用正確的括號和嵌套來控制它。

+0

這是一個比答案更多的評論 – 2010-05-25 19:01:23

0

在您的第一個示例中,C和D將不會與B有關 - 它們是第一個if(A)中的else s。這是由大括號確保的。在第二個例子中,else可能會對應到ifelse條款被匹配到最近的可能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 
| | | | 

未能正確組您報表將在某些瀏覽器導致不正確的分組給你一個地獄調試。