clearinterval可以直接用setinterval调用吗?

Can clearinterval be called directly with setinterval?

各位互联网大牛们好:)

在玩一些 JS 时,我注意到我无法在 clearInterval(var).

中使用 setInterval(function, milliseconds) 的 return 值

这是清除间隔的工作版本:

const intervalId = setInterval(() => foo(), 500);
setTimeout(() => clearInterval(intervalId), 2000);

在此示例中,间隔每 500 毫秒调用方法 foo()。 2 秒后,这将被 setTimeout(function, milliseconds) 中嵌套的 clearInterval(intervalId) 停止。

在 clearInterval 中使用 setInterval 无效:

setTimeout(() => clearInterval(setInterval(() => foo(), 500)), 2000);

与上面的例子不同,这里没有使用变量来保存setInterval()的return值。
然而它导致间隔从未被调用/立即停止
这对我来说很奇怪(可能是一个错误?)。

有人可以给出意见/解释一下吗?
谢谢:)

是的,可以设置一个interval或者timeout,然后用timeout/interval的ID清零 - 但是,意义不大,因为那时间隔函数将永远不会运行,因为间隔会立即被清除。这就是这里发生的事情。如果您不想立即清除间隔,则应将间隔 ID 存储在变量中(就像您在上面使用 int 所做的那样)。

除了将间隔 ID 存储在变量中之外,您还可以将间隔 ID 传递到 IIFE 中,但这基本上是做同样的事情 - 间隔 ID 将存储在参数中而不是独立的变量。

const foo = () => console.log('foo');

(int => {
  setTimeout(() => {
    clearInterval(int);
  }, 2000);
})(setInterval(foo, 500));

我还推荐:

  • 如果您的超时或间隔只调用函数,只需传递函数本身。无需将其包装在另一个中。例如,只要调用上下文无关紧要,您始终可以将 () => foo(); 替换为 foo();.
  • 使用 int 作为变量名可能会让那些使用其他语言并期望 int 关键字 而不是变量名的人感到困惑.也许叫它 intervalId