调用已分配SetTimeout的JavaScript函数

调用已分配SetTimeout的JavaScript函数,javascript,jquery,html,settimeout,Javascript,Jquery,Html,Settimeout,我不能100%确定setTimeout在JavaScript中是如何工作的。假设我有这样的东西: $(document).ready(function() { testTimeout(); }); function testTimeout() { alert("testing timeout"); setTimeout(testTimeout, 5000); } 这将在页面准备就绪后每隔5分钟显示一个弹出窗口。如果我通过点击按钮调

我不能100%确定setTimeout在JavaScript中是如何工作的。假设我有这样的东西:

$(document).ready(function() {           
    testTimeout();        
});

function testTimeout() {
    alert("testing timeout");
    setTimeout(testTimeout, 5000);
}
这将在页面准备就绪后每隔5分钟显示一个弹出窗口。如果我通过点击按钮调用testTimeout,会发生什么

$("#button").click(function() {        
    testTimeout();
}); 
该按钮是否会单击CallTestTimeout并每隔5秒添加一个超时?或者,按钮是否会单击重置按钮按下时的超时?我问这个问题的原因是因为我想设计这样的东西,在这里我可以向超时函数传递一个参数。当网页启动时,我有一个默认参数。但是,如果我按下一个按钮,我希望我的超时函数立即调用,并在使用新参数后每隔5秒调用一次。但是,我不希望带有旧参数的timeout函数继续重复。我怎样才能做到这一点?任何帮助和理解都将不胜感激

这将在页面准备就绪后每隔5分钟显示一个弹出窗口

不,它不会,它会毫无延迟地重复显示警报和/或导致“太多递归”错误,因为
setTimeout(testTimeout(),5000)
调用
testTimeout
并将其返回值传递到
setTimeout
,就像
foo(bar())
调用
bar
并将其返回值传递到
foo

如果删除
()

然后它就会这样做

如果我通过点击按钮调用testTimeout,会发生什么

$("#button").click(function() {        
    testTimeout();
}); 
最终,函数被调用的频率会增加一倍(超过每5秒一次),因为每次调用它时,它都会重新安排自己的时间。第三次会使它更频繁地静止(三次/秒),依此类推


如果要避免这种情况,一个选项是记住计时器句柄,如果在此之前调用函数,则取消任何未完成的定时回调:

var handle = 0;
function testTimeout() {
    clearTimeout(handle); // Clears the timed call if we're being called beforehand
    alert("testing timeout");
    handle = setTimeout(testTimeout, 5000);
}

(我用
0
初始化
handle
,因为用
0
调用
clearTimeout
是不可操作的。)

在您的例子中,它只会无休止地重复,因为您正在执行函数而不是传递引用。你应该这样做:

function testTimeout() {
    alert("testing timeout)";
    setTimeout(testTimeout, 5000);
}
注意
testTimeout
之后缺少的大括号。这会告诉
setTimeout
执行该函数,而不是该函数的结果,这是原始代码的行为方式

“我希望使用新参数立即调用超时函数,并且每5秒调用一次。但是,我不希望使用旧参数的超时函数继续重复”

为了实现您尝试执行的操作,您应该删除超时:

var timeoutId;
function testTimeout() {
    alert("testing timeout)";
    clearTimeout(timeoutId );
    timeoutId = setTimeout(testTimeout, 5000);
}
注:

  • 您可以通过捕获setTimeout方法返回的id并将其传递给clearTimeout方法来停止触发上一个timeoutI

您是否尝试将变量指定给设置间隔

var foo = setTimeout(testTimeout(), 5000);
然后,当正确的事件发生时,请销毁该变量

clearInterval(foo);

现在您可以再次登录…

“这将在页面准备就绪后每隔5分钟显示一个弹出窗口。”不,不会,它会毫不延迟地重复显示警报。您的警报有语法错误真的吗?对我来说,情况似乎不是这样的?OP edited,一个引号和一个括号被编辑过(见你的答案,你会看到),你想在点击按钮时重置超时,还是什么都不做?这个脚本是一个递归的噩梦D:@SterlingArcher:它和最初写的一样,是的。如果没有
()
,这是一个相当常见的重复动作习惯用法(另一个当然是
setInterval
)。对不起,我忘了从setTimeout中删除()。那么,我如何防止它重新安排自己呢?我只想每5秒超时一次。但是,当我单击一个按钮时,我想更改超时函数中使用的参数。@user3781214:您可以通过保存计时器句柄并使用
clearTimeout
来完成此操作,我已将其添加到上面。您也可以
clearTimeout
,因此无需使用intervalsTrue,我忘了他正在调用相同的方法,哪个触发另一个设置超时