1

我有一个这样构造的 JavaScript 调用:

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

WhiletriggerControls()为 , 做以防万一的类型检查undefined,并controlsVisibility用作默认参数来确定它应该做什么。我认为:

  • 我是否犯了一个错误,没有在子句controlsVisibility中作为函数 arg传递。if如果该变量的值在我调用triggerControls()和函数执行之间发生变化(微秒?) - 我应该:

    1. 通过使用全局状态来解释可能的变化就像现在一样

      或者

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

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

如果当前的实现(1)没问题

在执行相同功能时,if我可以将两种场景检查合二为一。||除了变得凌乱并且使代码在很大程度上难以阅读之外,为什么我不应该这样做呢?

4

2 回答 2

2

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

不会。当你的脚本正在执行时,没有其他东西会改变这个变量——JavaScript 是单线程的。除非triggerControls执行异步操作并期望在事件循环的未来轮次中值相同,否则一切都很好。

如果仅使用 ||,我可以将两种场景检查合二为一。因为我正在执行相同的功能。除了变得凌乱并且使代码在很大程度上难以阅读之外,为什么我不应该这样做呢?

我看不出有理由不这样做。避免重复并不麻烦(但枯燥),我不会认为它不可读。您甚至可以使用三元运算符来缩短(和优化)它:

if (controlsVisibility
      ? currentScroll > (previousScroll + 100)
      : $(this).scrollTop() == 0
) {
    triggerControls();
}
于 2013-08-24T20:08:28.087 回答
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();
};

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

于 2013-08-24T20:16:36.703 回答