2011-03-08 39 views
9

我一直寫我的JavaScript塊JavaScript的條件塊,相較於控制流

var functionName = function() { 
    if (someCondition) { 
     // stuff 
    } else { 
     // stuff 
    } 
}; 

但今天空白的回報,我看到

var functionName = function() { 
    if (someCondition) { 
    // stuff 
    return; 
    } 
    // stuff 
}; 

我喜歡的第一個例子是在邏輯更加明確。 爲什麼你會或不想以第二種方式演示?

+1

請參閱http://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement有些想法 – Jimmy 2011-03-08 21:06:25

+0

好的!我希望我能在我的搜索中找到。謝謝。 – 2011-03-08 21:07:34

回答

11

如果您獲得的更多,請減少縮進someCondition

試想:

var functionName = function() { 
    if (someCondition) { 
     // stuff 
    } else { 
     // stuff 
     if (someConditionB) { 
      // stuff 

     } else { 
      // stuff 

      if (someConditionC) { 
       // stuff 

      } else { 
       // stuff 

       if (someConditionD) { 
        // stuff 
       } else { 
        // stuff 
       } 
      } 
     } 
    } 
}; 

這將是沒有所有的別人的很多更具可讀性:

var functionName = function() { 
    if (someCondition) { 
     // stuff 
     return; 
    } 

    if (someConditionB) { 
     // stuff 
     return; 
    } 

    if (someConditionC) { 
     // stuff 
     return; 
    } 
    if (someConditionD) { 
     // stuff 
     return; 
    } 

    // stuff 
}; 
1

您可能要在2情況下使用方法2:

案例1:你有你的邏輯之後更多的東西,你不想跑。執行的代碼可以滿足您的所有需求,而且您不需要額外的東西。情況2:根據函數附加的內容,你想返回一個false來阻止一個動作。一旦這樣的例子將是一個表格onSubmit,並驗證輸入。如果不好,立即返回false,並阻止表單提交。

4

許多編碼標準的任務,你不應該「早退出」從功能。這是在可讀性和「正確性」之間取捨的折衷[*]

早期退出可以避免後續代碼在額外的級別中縮進。例如,恕我直言,有一些錯誤檢測檢查是有意義的,它們在函數的頂部分組在一起,在失敗時提前退出,函數的內容正常。

另一方面,當爲了調試目的而閱讀代碼時,很容易錯過早期退出,並最終嘗試在代碼的錯誤部分找到錯誤。

[*]那些相同的代碼標準通常不會使用breakcontinue。 FWIW我認爲這是Djikstra過度應用「GOTO被認爲有害」的口頭禪的症狀。

+0

太棒了!這是可讀性和標準之間的謹慎舞蹈。謝謝。 – 2011-03-08 23:18:36