2013-08-24 59 views
1

時,我有一個JavaScript調用結構是這樣的:更緊湊的「如果...否則,如果」執行相同的代碼

if (($(this).scrollTop() == 0) && !controlsVisibility) { 
    triggerControls(); 
} 
else if (currentScroll > (previousScroll + 100) && controlsVisibility) { 
    triggerControls(); 
}; 

雖然triggerControls()確實剛剛在案件類型檢測,爲undefined,並使用controlsVisibility默認arg確定它應該做什麼。我認爲:

  • 難道我做不及格controlsVisibility的功能ARG內if條款的錯誤。如果該變量的變化值之間我打電話triggerControls()和功能的執行(?微秒) - 我應該:

    1. 賬戶使用全局狀態像現在

      的可能變化

    2. 預先通過穩定的參數來干擾變化

      據我所知,這可能會根據具體情況確定,但我真的很感激一些提示。

如果當前執行(1)是OK

我可能已經只是因爲我執行同樣的功能使用||在一個if書面兩種情況的檢查。除了被弄得亂七八糟並且使得代碼大部分不可讀爲什麼我不應該那樣做?

回答

2

如果()該變量的變化之間我打電話triggerControls和功能的執行(微秒?)

號當你的腳本執行價值,什麼都沒改變變量 - JavaScript是單線程的。除非triggerControls做了一些異步操作,並且預計未來事件循環中的值將保持不變,否則一切正常。

我可以,如果只是通過使用已經寫了這兩個方案將檢查一個||因爲我正在執行相同的功能。除了被弄得亂七八糟並且使代碼大部分不可讀,爲什麼我不應該這樣做呢?

我沒有看到沒有這樣做的理由。避免重複(但是dry)並不難,我也不會認爲它是不可讀的。你甚至可以使用ternary operator縮短(優化)是:

if (controlsVisibility 
     ? currentScroll > (previousScroll + 100) 
     : $(this).scrollTop() == 0 
) { 
    triggerControls(); 
} 
+0

恭喜3000個答案,並且非常感謝! – ermik

2

我不同意與一個||操作滾動兩個條件是不可讀的聲明。使用正確的格式化它是非常可讀的:

if (
    (($(this).scrollTop() == 0) && !controlsVisibility) || 
    (currentScroll > (previousScroll + 100) && controlsVisibility) 
) { 
    triggerControls(); 
}; 

這很明顯是由controlsVisibility切換的兩個條件。我個人寧願controlsVisibility進行檢查第一次使一個事實,即它是一個開關更清晰:

if (
    (controlsVisibility && currentScroll > (previousScroll + 100)) || 
    (!controlsVisibility && ($(this).scrollTop() == 0)) 
) { 
    triggerControls(); 
}; 

不過,你也問我有寫這個更緊湊的方式有:

if (controlsVisibility ? 
     currentScroll > (previousScroll + 100) : 
     $(this).scrollTop() == 0 
) { 
    triggerControls(); 
}; 

我認爲上面的代碼是顯而易見的,但不是每個人都喜歡三元運算符。

+0

我其實不知道在這種情況下該如何表現。但是,儘管我強烈地感受到了這兩個答案,@Berghi的精確性和專業性更強 - 他捕捉到了我的一些愚蠢。謝謝你的詳細解釋 - 這非常有用。 – ermik

+0

投票對我來說無關緊要。很高興我能幫上忙。感謝upvote :) – slebetman