如何在Javascript中强制清除间隔

如何在Javascript中强制清除间隔,javascript,Javascript,全部: 我想知道是否有办法强制清除所有间隔计数器,例如: /* var counter = */ setInterval(function(){console.log("Tick")}, 1000) 但我忘记了获取计数器变量的引用,如果在控制台中打印出来,它是一个数字,我想知道是否有办法找到该间隔是什么数字,因此我可以调用clearInterval,关于id,您唯一可以确定的是,它将是一个大于零的整数。看 让handle为用户代理定义的大于零的整数,它将标识活动计时器列表中此调用要设置的超时

全部:

我想知道是否有办法强制清除所有间隔计数器,例如:

/* var counter = */ setInterval(function(){console.log("Tick")}, 1000)

但我忘记了获取计数器变量的引用,如果在控制台中打印出来,它是一个数字,我想知道是否有办法找到该间隔是什么数字,因此我可以调用clearInterval,关于id,您唯一可以确定的是,它将是一个大于零的整数。看

让handle为用户代理定义的大于零的整数,它将标识活动计时器列表中此调用要设置的超时

因此,您可以非常低效地尝试以下所有方法:

for (let i = 1; i < Number.MAX_SAFE_INTEGER; i++) {
    clearInterval(i);
}
请注意,这将需要一段时间,这需要大量的数字来循环,尽管您可能会假设浏览器将按顺序发布这些数字,并且您生成的数字永远不会超过某个数字

还请注意:

setInterval和setTimeout使用的ID池是共享的,这意味着您可以在技术上互换使用clearInterval和clearTimeout


因此,这将清除所有setTimeout调用以及所有setInterval调用。

唯一可以确定的是,id将是一个大于零的整数。看

让handle为用户代理定义的大于零的整数,它将标识活动计时器列表中此调用要设置的超时

因此,您可以非常低效地尝试以下所有方法:

for (let i = 1; i < Number.MAX_SAFE_INTEGER; i++) {
    clearInterval(i);
}
请注意,这将需要一段时间,这需要大量的数字来循环,尽管您可能会假设浏览器将按顺序发布这些数字,并且您生成的数字永远不会超过某个数字

还请注意:

setInterval和setTimeout使用的ID池是共享的,这意味着您可以在技术上互换使用clearInterval和clearTimeout


因此,这将清除所有setTimeout调用以及所有setInterval调用。

另一个选项,我不喜欢的一个,是monkey补丁setInterval。基本上,将其装饰为在其他地方存储setInterval的引用

allIntervals = []
originalSetInterval = window.setInterval
window.setInterval = (...args) => {
    const interval = originalSetInterval(...args)
    allIntervals.push(interval)
    return interval
}

// ...
setInterval(function(){console.log("Tick")}, 1000)
setInterval(function(){console.log("Tick 2")}, 1000)
那就只需要打电话给所有人,让他们清场

allIntervals.map(window.clearInterval)

您可能还需要覆盖window.clearInterval,并从AllInterval中弹出正确的值。

另一个选项,我不喜欢的选项是monkey patch setInterval。基本上,将其装饰为在其他地方存储setInterval的引用

allIntervals = []
originalSetInterval = window.setInterval
window.setInterval = (...args) => {
    const interval = originalSetInterval(...args)
    allIntervals.push(interval)
    return interval
}

// ...
setInterval(function(){console.log("Tick")}, 1000)
setInterval(function(){console.log("Tick 2")}, 1000)
那就只需要打电话给所有人,让他们清场

allIntervals.map(window.clearInterval)

您可能还需要覆盖window.clearInterval,并从AllInterval中弹出正确的值。

否。如果要清除间隔,您必须跟踪setInterval的返回值。您需要存储引用以清除相应的间隔。请不要忘记。如果要清除所有间隔,也许你可以试试蛮力:对于var i=1;i<999999;i++窗口。clearIntervali;。forint i=0;i否。如果要清除间隔,必须跟踪setInterval的返回值。您需要存储引用以清除相应的间隔。请不要忘记。如果要清除所有间隔,可能可以尝试暴力:对于var i=1;i<999999;i++窗口。clearIntervali;。forint i=0;我可能比const maxInteger=setInterval=>{}更快,0;对于let i=1;我可能比const maxInteger=setInterval=>{}更快,0;对于let i=1;我没有使用猴子补丁,而是使用不同的名称定义新函数。如果答案不鼓励修改全局函数的行为,那么支持它会容易得多。与其使用猴子补丁,不如用不同的名称定义新函数来完成这项工作。支持一个不鼓励修改全局函数行为的答案会容易得多。