1

このように構造化された JavaScript 呼び出しがあります。

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

whiletriggerControls()の場合に備えて型チェックを行い、デフォルトの arg としてundefined使用controlsVisibilityして、正確に何をすべきかを決定します。おもう:

  • controlsVisibility内で関数引数として渡さないという間違いを犯しましたか。ifその変数の値が、呼び出しtriggerControls()と関数の実行の間で変化する場合 (マイクロ秒?) — 次のことを行う必要があります。

    1. グローバル状態を使用して可能な変更を考慮します(現在のように)

      また

    2. 事前に安定した引数を渡して変更を妨害しますか?

      ケースバイケースで判断されることは承知しておりますが、何かアドバイスをいただければ幸いです。

現在の実装(1)で問題ない場合

同じ関数を実行しているのでif、使用するだけで、両方のシナリオ チェックを 1 つに記述できました。乱雑でコードをほとんど読め||なくすることを除いて、なぜ私はそれをすべきではないのですか?

4

2 に答える 2

2

||演算子を使用して 2 つの条件をローリングすることは判読できないというステートメントには同意しません。適切なフォーマットを使用すると、非常に読みやすくなります。

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

それは明らかに によって切り替えられた 2 つの条件controlsVisibilityです。controlsVisibility個人的には、スイッチであるという事実をより明確にするために、最初にチェックすることを好みます。

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

ただし、これを書くためのよりコンパクトな方法があるかどうかも尋ねました。

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

上記のコードは明白で読みやすいですが、誰もが三項演算子を好むわけではありません。

于 2013-08-24T20:16:36.703 に答える