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

如何修改/覆盖由无限setInterval调用的javascript函数?,javascript,xss,intervals,Javascript,Xss,Intervals,假设我们有我无权访问/无法更改的代码 function f() { // bad tasks } setInterval(f, 10000); 我想修改函数f,所以我在下面写了类似的东西 window.f = function(){ // good tasks } 但是包含错误任务的原始函数f()仍然每10秒运行一次。似乎传入setInterval的函数仍然指向原始函数。 如何停止它?单向: function f() { //bad tasks } setInterval(func

假设我们有我无权访问/无法更改的代码

function f() {
// bad tasks
}
setInterval(f, 10000);
我想修改函数f,所以我在下面写了类似的东西

window.f = function(){
// good tasks
}
但是包含
错误任务的原始函数
f()
仍然每10秒运行一次。似乎传入
setInterval
的函数仍然指向原始函数。 如何停止它?

单向:

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);

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


在不编辑原始脚本的情况下,无法更改此设置。您所能做的就是清除站点上的所有间隔,然后开始另一个间隔。请参阅。

不要使用
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);

看到这个问题,我认为Noob无法更改
setInterval
部分。您的第一种方法不起作用(已测试)。第二种方法不适用于Noob,因为我无权访问的代码/I无法更改,并且Noob无法清除旧的间隔。@AndrewD。如果Noob愿意清除所有当前的间隔,他可以终止有问题的间隔(只需从0循环到下一个间隔id,从
setInterval
并清除每个间隔;)@AndrewD。你能告诉我你是怎么测试的吗?它对我的配置有效:。正如Yoshi所解释的那样,它对Noob没有帮助,但它仍然应该工作。@penartur,我想说的是,
setInterval(function(){f();},10000),
并没有取代原来的“setInterval(f,10000);”无法帮助。您确定定义了哪些代码错误的函数:
function f(){}
,而不是
var f=function(){}