2015-03-25 97 views
0

我在審查邏輯看起來有瑕疵的代碼。我不確定下面的代碼是否會返回false,因爲if返回流。我的問題是,下面的代碼是否會返回false,甚至會拋出錯誤?這段代碼是否會返回false?

function performSearch(e) { 
    if(e.keyCode === RETURN_KEY_KEYCODE) { 
     var select = document.getElementById("selectmenusearch"); 
     var selected = select.options[select.selectedIndex].value; 
     if(selected === 'organisation') { 
      submitSearchForm('<%= doOrganisationSearchURL %>'); 
     } else { 
      submitSearchForm('<%= doIndividualSearchURL %>'); 
     } 
    } else { 
     return false; 
    } 
    return true; 
} 

因此流向我看起來像

if (this condition is true) { 
    //execute some code 
} else { 
    return false 
} 
else return true 

注:我知道這將是更好的重構有隻有一個返回語句,但就像有兩個else語句在我看來。

+0

當'e.keyCode!== RETURN_KEY_KEYCODE'? – thefourtheye 2015-03-25 11:45:18

+0

並不清楚你的要求,看起來像一個非常規則的if/else塊 – Veverke 2015-03-25 11:45:48

+0

它應該等於RETURN_KEY_CODE,因爲它正在檢查按鍵,if它已被按下,然後表單可以提交 – br3w5 2015-03-25 11:46:35

回答

1

它依賴於e.keyCode,但是如果e.keyCode不總是等於RETURN_KEY_CODE,它將不會總是返回false。你有2個回報。第一個是在第一個,如果是的話,如果e.keyCode!== RETURN_KEY_CODE,則返回false。否則,你如果將正常結束,並且它後面的指令返回true。

function performSearch(e) { 
    if(e.keyCode === RETURN_KEY_KEYCODE) { 
     ... 
    } else { 
     return false; // RETURN_KEY_KEYCODE !== e.keyCode 
    } 
    return true; // RETURN_KEY_KEYCODE === e.keyCode 
} 

我沒有看到任何等待它可以一直返回假如果e.keyCode不總是相同的值。 :)

如果你想更清楚一點,你可以把返回結果放在第一個if。像這樣:

function performSearch(e) { 
    if(e.keyCode === RETURN_KEY_KEYCODE) { 
     ... 
     return true; // RETURN_KEY_KEYCODE === e.keyCode 
    } else { 
     return false; // RETURN_KEY_KEYCODE !== e.keyCode 
    } 

} 
+0

我喜歡編輯的明確性 – br3w5 2015-03-25 12:02:00

1

只要運行測試。好像你對一個函數中有多個「return」語句時發生的情況感到困惑。

return語句與其他任何語句一樣是一個常規語句 - 除了它會中斷本地塊執行並將流控制返回給調用該函數的代碼。對你而言,你有一個,兩個,三個回報......語言翻譯嚴格遵循IF/ELSE規則 - 如果滿足一個條件,那麼該塊(用{{}定義如果是被執行的那個,如果條件不滿足,那麼相應的if的else塊被執行。無論是什麼情況,if和else塊在到達它們的末尾時都會返回到下一個語句如果塊,在這裏的例子, 「返回true」(IF塊由如果還有+塊組成)。

(function() { 
    if (k) { 
     console('k renders true'); 
    } 
    else { 
     console.log('else reached'); 
     return false; 
    } 
    return true; 
    console.log('bottom return true reached'); 
})();