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
?
各位互联网大牛们好:)
在玩一些 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
?