执行相同代码时更紧凑“if ... else if”

时间:2013-08-24 19:13:34

标签: javascript if-statement

我以这种方式构建了一个JavaScript调用:

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

虽然triggerControls()执行undefined的只是案例检查,并且使用controlsVisibility作为默认arg确定它应该做什么。我想:

  • 我是否错误地将controlsVisibility作为函数arg传递到if子句中。如果该变量的值在我调用triggerControls()和函数执行(微秒?)之间变化 - 我应该:

    1. 通过使用全局状态来解释可能的更改,因为它现在是

    2. 通过提前传递稳定的args来干扰更改

      我知道这可以根据具体情况确定,但我真的很感激一些提示。

如果当前的实施(1)是正确的

  

我只能使用if在一个||中编写两个方案检查,因为我正在执行相同的功能。除了凌乱并使代码难以理解为什么不应该这样做呢?

2 个答案:

答案 0 :(得分:2)

  

如果该变量的值在我调用triggerControls()和函数执行(微秒?)之间发生变化

没有。当您的脚本正在执行时,没有其他任何内容会改变该变量--JavaScript是单线程的。除非triggerControls执行某些异步操作并且期望在将来的事件循环中使用相同的值,否则一切都很好。

  

如果仅使用||,我可以在两个方案中编写两个方案检查因为我正在执行相同的功能。除了凌乱并使代码基本上不可读之外我为什么不应该这样做呢?

我没有理由不这样做。避免重复并不是很混乱(但dry),我不认为它不可读。您甚至可以使用ternary operator缩短(并优化)它:

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

答案 1 :(得分: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();
};

我认为上面的代码很明显且可读,但不是每个人都喜欢三元运算符。