调用已分配SetTimeout的JavaScript函数
我不能100%确定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分钟显示一个弹出窗口。如果我通过点击按钮调
$(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,我忘了他正在调用相同的方法,哪个触发另一个设置超时