如何修改/覆盖由无限 setInterval 调用的 javascript 函数

How do I modify/overwrite a javascript function that is called by an infinite setInterval?

本文关键字:setInterval 无限 调用 函数 javascript 覆盖 何修改 修改      更新时间:2023-09-26

假设我们有这个我无法访问/我无法更改的代码。

function f() {
// bad tasks
}
setInterval(f, 10000);

我想修改函数 f,所以我在下面写了这样的东西。

window.f = function(){
// good tasks
}

但是包含bad tasks的原始函数f()仍然每 10 秒运行一次。似乎传递给setInterval的函数仍然指向原始函数。我该如何阻止它?

您的假设是正确的:间隔保留对原始f的引用。

如果不编辑原始脚本,就无法更改此设置。您所能做的就是清除网站上的所有间隔并开始另一个间隔。请参阅 https://stackoverflow.com/a/8860203/27862。

一种方式:

function f() {
    //bad tasks
}
setInterval(function() { f(); }, 10000);
window.f = function() {
    //good tasks
}

这样计时器就不会调用传递给它的旧 f(),而是调用当前名为 f 的函数。

其他方式:

function f() {
    //bad tasks
}
var interval = setInterval(f, 10000);
function g() {
    //good tasks
}
clearInterval(interval);
setInterval(g, 10000);

不要使用 setInterval,请改用 setTimeout。它将为您提供所需的控制权。

function f() {
 // bad tasks
 fTimeout = setTimeout(f,1000);
}
//start
var fTimeout = setTimeout(f,1000);

现在,如果发生了不好的事情并且您想重写f

clearTimeout(fTimeout);
window.f = function() { 
            /* good stuff */ 
            fTimeout = setTimeout(f,1000);
           }
fTimeout = setTimeout(f,1000);

参见